遇到了一个问题:
public class DaoFactory{
private static DaoFactory instance = new DaoFactory();
private static UserDao userDao = null;
private DaoFactory(){
try{
Properties prp = new Properties();
InputStream in = new FileInputStream(new File("src/dbconfig.properties"));
prp.load(in);
String userDaoClass = prp.getProperty("UserDaoClass");
userDao = Class.forName(userDaoClass).newInstance();
}catch(Exception e){
throw new RuntimeException("类初始化有误");
}
public static DaoFactory getInstance(){
return this.instance;
}
public UserDao getUserDao(){
return this.userDao;
}
}
}
调用:
public class DaoFactoryTest{
public static void main(String[] args){
UserDao userDao = DaoFactory.getInstance().getUserDao();
System.out.println(userDao);
}
}
这样子调用居然会出现null指针异常。
重新分析了一下代码才发现,原来出错的地方是这样的,没有注意到代码块加载的顺序,其实是这样的 静态属性static首先被加载
private static DaoFactory instance = new DaoFactory();
private static UserDao userDao = null;
也就是说两个静态属性都首先加载了,但是初始化是有顺序的,从上到下,先初始化第一个静态属性,instance被初始化以后,userDao也就初始化有值了,但是接着又对userDao初始化,也就是第二句,再次把userDao赋值为null,所以当我们在调用的时候,返回的就是一个空结果了。
找到问题的源头自然也就好解决问题了,我们只需要把他们顺序换一下就好了
private static UserDao userDao = null;
private static DaoFactory instance = new DaoFactory();
这样子就能正确的返回结果了。