2012-08-10 3 views
1

CDI 기반 방법으로 리플렉션을 사용하여 문자열 이름별로 클래스를 반환하는 Factory 클래스를 바꾸려고했습니다.인스턴스 목록에 액세스하면 NullPointerException이 반환됩니다.

따라서 @Inject @Any Instance<IData> possibleCandidates을 클래스 변수로 지정합니다. 그런 다음 getIDataInstanceByClassname(String className)에서 Class.forName을 통해 인스턴스를 만들고이를 possibleCandidates 목록의 모든 인스턴스와 비교하여 일치하는 "주사 가능한"인스턴스를 반환합니다.

그러나 possibleCandidates에 액세스하는 경우는 NullPointerException이됩니다. for 루프를 시작하거나 possibleCandidates.iterator()을 사용할 지 여부 그러나 변수를 검사해도 null은 반환되지 않지만 InstanceImpl<T>은 다양한 값으로 채워집니다.

어떻게 액세스하면 NPE가 생성됩니까?

일부 코드 :

@Instance 
@Any 
private Instance<IData> possibleCandidates; 

public IData getClassByClassname(String className) { 

    try { 
     Class<?> clazz = Class.forName(className); 
     Iterator<IData> it = possibleCandidates.iterator(); // NPE gets thrown here 
     while (it.hasNext()) { 
      IData dataInstance = it.next(); 
      if (dataInstance.getClass().equals(clazz)) { 
       return dataInstance; 
      } 
     } 
    } 
    catch(Exception e) { ... } 
} 
+0

코드와 전체 스택 추적을 보면 문제가있는 곳을 찾을 수 있습니다. –

+0

디버그 모드에서 스택 추적을 얻을 수 없으므로 마지막으로 스택 추적을 인쇄하는 또 다른'log.error (e.getMessage(), e)'를 추가했습니다. 주입 된 클래스 중 하나에이 "숨겨진"NullPointerException을 발생시키는 문제가있는 것처럼 보입니다. –

+0

Odd. 스택 추적이나 다른 코드를 통해 더 많은 정보가 도움이 될 것입니다. – LightGuard

답변

2

인스턴스 목록에 대한 액세스 실패의 원인이 건설시에 NullPointerException이 생산 된 목록에서 하나 개의 클래스가 발생했습니다. 디버깅 모드에서 NPE의 원인을 볼 수 없었지만 일부 로깅을 추가하면 근본적인 원인이 분명해졌습니다.

아이들을 기억하십시오. 항상 예외 블록을 catch 블록에서 다시 발생 시키거나 무언가로 돔을 만듭니다. 그러나 원래 예외를 원인으로 두지 않고 다른 예외를 throw하지 마십시오.

관련 문제