Java静态初始化的问题,和大家一起探讨
public class DaoFactory {
private static DaoFactory instance = new DaoFactory();
private static UserDao userDao = null;//为什么这个放在instance下面,外界使用该工厂获取userdao会出现空指针异常呢?;同时如果把userDao的静态去掉就又没问题了;
//同时如果说把private static UserDao userDao = null;这个改为private static UserDao userDao;即没有=null这个动作,这个异常又没了,这也太诡异了;
//如果把private DaoFactory改成static,即初始化改为静态代码块时,问题又解决了;就不会出现空指针问题;
//如果把静态代码块改为构造代码块时,当然UserDao 的静态要去掉,就又没有问题了;
private DaoFactory() {
try {
Properties prop = new Properties();
InputStream inStream = DaoFactory.class.getClassLoader()
.getResourceAsStream("daoconfig.properties");
prop.load(inStream);
String userDaoClass = prop.getProperty("userDaoClass");
Class clazz = Class.forName(userDaoClass);
userDao = (UserDao) clazz.newInstance();
} catch (Throwable e) {
throw new ExceptionInInitializerError(e);
}
}
public static DaoFactory getInstance() {
return instance;
}
public UserDao getUserDao() {
return userDao;
}
}
java
static初始化?空指针异常
------解决方案--------------------是这样的 但是这只是我的个人理解
在加载DaoFactory时会先加载静态变量,也就是先会执行第一句代码,这时你new了一个对象,这样才有了dao的出现,因为dao不是静态而是属于一个具体对象的,当你new这个类时userDao才被创建,同时也赋了null值,这之后构造方法里面调用的userDao就是这个userDao,然后你给他赋值,之后就可以调用了
------解决方案--------------------lz这个代码写的真捉鸡。
static修饰的变量只会初始化一次,就是在这个类被加载的时候。看看lz你的代码的执行顺序
private static DaoFactory instance = new DaoFactory();//调用构造方法,userDao 同时被赋值。
private static UserDao userDao = null;//代码继续执行,userDao是个静态值又被赋值了一次,所以这个永远是null。
再看看把private static UserDao userDao = null;写在第一行
private static UserDao userDao = null;//静态初始化赋值为null这个没问题
private static DaoFactory instance = new DaoFactory();//代码继续执行,调用构造方法,userDao再次被赋值。
------解决方案--------------------
首先要知道 static属性时类级别 能被所有的实例调用
第一个问题:调用new DaoFactory()是初始化了userDao,但是下面一句userDao = null 吧userDao置null 所以空指针了,而吧userDao的static去掉以后就可以了:首先要知道private static UserDao userDao = null;和private UserDao userDao = null;的区别,前一句是一个执行一句,第二句只是个变量声明,简单说就是:第一句会在private static DaoFactory instance = new DaoFactory();执行后再去执行,而第二句不会,所以不会出现空指针了
第二个问题:吧=null;取消以后private static UserDao userDao;就不在是一个执行语句了,所以就不会吧userDao置为null
第三个问题:吧构造方法编程static以后 就变成了3个static,当你调用getUserDao方法是会依次调用
private static DaoFactory instance = new DaoFactory();初始化