2017-02-04 98 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

非常感謝,您的回答非常有幫助! –