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

정적 초기화 도구가 수행됩니다. 정적 필드 factory은 클래스 BussinessServiceFactory이로드 될 때 초기화됩니다. 이 정적 초기화 프로그램은 BussinessServiceFactory의 생성자를 호출하므로 결국 정적 필드 bsConfig에 대한 참조가로드됩니다. 이 필드는 아직 factory 필드의 정적 이니셜 라이저 블록에 있으므로이 시점에서 아직 초기화되지 않았습니다. 따라서 NullPointerException이 발생합니다.

수정이 중 1), 아직 더 factory 필드 위에, 또는 할 수 bsConfig 필드를 재정렬하는의 bsConfig 필드 당신이 그것을 해결하기 위해 무슨 짓 인스턴스 필드 (함으로써이 인터 의존성이 없어 나는 그런 문제를 해결할 수있는 최선의 방법이라고 생각한다).

정적 초기화 순서에 대한 자세한 내용은 http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.4을 참조하십시오.

부록 : stacktrace는 문제의 원인을 나타냅니다. 스택 추적의 clinitcl 엉덩이 의 약어이므로 클래스로드 중임을 알 수 있습니다.

+0

정말 고마워요, 당신의 대답은 매우 도움이됩니다! –