日期:2014-05-20  浏览次数:20796 次

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再次被赋值。

------解决方案--------------------




引用:
问题描述:;
private static DaoFactory instance = new DaoFactory();
private static UserDao userDao = null;
//为什么这个放在instance下面,外界使用该工厂获取userdao会出现空指针异常呢?;同时如果把userDao的静态去掉就又没问题了;
//同时如果说把pr……


首先要知道 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();初始化