package cn.dzr.jdbc.dao;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;
public class DaoFactory {
   private static UserDao dao = null;
   private static DaoFactory instance = new DaoFactory();
   
   
   private DaoFactory()
   {
       
       try
       {
           System.out.println("进入try方法");
            Properties prop = new Properties();
            File file = new File("src/daoconfig.properties");
            InputStream in = new FileInputStream(file);
            in = DaoFactory.class.getClassLoader().getResourceAsStream("daoconfig.properties");
            prop.load(in);
            String userDaoName = prop.getProperty("UserDaoClass");
            System.out.println(userDaoName);
            Class clazz = Class.forName(userDaoName);
            System.out.println("类加载完成!!");
            dao = (UserDao)clazz.newInstance();
            System.out.println("创建类成功!"+dao.getClass().getName());
       }
       catch(Exception e)
       {
           throw new ExceptionInInitializerError(e);
           //初始化错误!
       }
   }
   
   public static DaoFactory getInstance()
   {
       return instance;
   }
   
   public UserDao getUserDao()
   {
       return dao;
   }
}
代码如上。
问题1:
private static UserDao dao = null;
   private static DaoFactory instance = new DaoFactory();教程里说,这里的两句代码的顺序不能更换,原因是更换之后,因为dao = null 会在创建实例后执行,结果导致return的时候,返回一个空的dao.之后,经过测试,果然会出现这样的情况。
但是,我将dao改成非静态成员,或者只定义,不赋初值,结果dao的位置可以放在任意的地方,代码均能正确的执行。这里不理解的地方:
   dao已经存在,否则new DaoFactory()里调用dao就会失败。
   既然dao已经存在,private static UserDao dao = null; 不是已经被执行了么?
   
在   private static DaoFactory instance = new DaoFactory();
private static UserDao dao = null;
这里的过程到底是如何呢。
先把所有的成员变量都加载了,然后再执行构造方法?
接着按从上到下的顺序把每一条赋值语句(一些变量可能有初始化值,比如上面的设置为Null)都执行一次么?2,           in = DaoFactory.class.getClassLoader().getResourceAsStream("daoconfig.properties");
          
这句代码,检索的范围有多宽呢。只要配置文件是在这个工程里,都会被找到么?
3, 虚拟机是多线程执行么?
        进入try方法
 java.lang.NullPointException。
类加载完成!!
创建类成功!
空指针异常偶尔有情况会出现如上这种情况。