2017-02-04 58 views
1

我已经设置了一个私有静态属性对象加载在我的工厂类的一些配置工厂类的构造函数中。私人静态属性变量导致空指针异常

public class BussinessServiceFactory { 
    private static final BussinessServiceFactory factory = new BussinessServiceFactory(); 
    public static BussinessServiceFactory createBussinessServiceFactory(){ 
     return factory; 
    } 
    private BussinessServiceFactory(){ 
     InputStream in = BussinessServiceFactory.class.getClassLoader().getResourceAsStream("factory/bussinessservice.properties"); 
     try { 
      bsConfig.load(in); 
     } catch (IOException exception) { 
      // TODO Auto-generated catch block 
      throw new RuntimeException(exception); 
     } 
    } 
    private static Properties bsConfig = new Properties(); 
    public <T> T createBussinessService(Class<T> clazz){ 
     try { 
      String clazzName = clazz.getSimpleName(); 
      String name = bsConfig.getProperty(clazzName); 
      return (T) Class.forName(name).newInstance(); 
     } catch (InstantiationException | IllegalAccessException 
       | ClassNotFoundException exception) { 
      throw new RuntimeException(exception); 
     } 
    } 
} 

但是,当我初始化类时,它会抛出NullPointerException

java.lang.NullPointerException 
    at factory.BussinessServiceFactory.<init>(BussinessServiceFactory.java:15) 
    at factory.BussinessServiceFactory.<clinit>(BussinessServiceFactory.java:8) 
    ... 24 more 

然后,如果我将属性对象更改为非静态对象,问题就解决了。但我仍然对这种情况发生的原因以及如何以这种方式解决问题感到困惑。

+0

那么,例外说这个问题是在* testFindOrder *,你向我们展示* testPageQuery *。我们如何帮助你? – CKing

回答

1

静态初始化程序自顶向下完成。所以当加载类BussinessServiceFactory时,静态字段factory被初始化。此静态初始化程序为BussinessServiceFactory调用构造函数,因此最终会加载对静态字段bsConfig的引用。此字段尚未初始化,因为我们仍处于factory字段的静态初始化程序块中。因此,NullPointerException。

修复此:1)重新排序bsConfig场为高于factory场,或更好,但没有通过使bsConfig领域的实例字段(这是你对解决它这个场间相关性,我相信这是解决这个问题的最好方法)。

有关静态初始化顺序的详细信息,请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.4

附录: stacktrace显示问题的根源。堆栈跟踪中的clinit代表cl ass init,因此,您可以看出问题是正在加载类。

+0

非常感谢,您的回答非常有帮助! –