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) { ... }
}
코드와 전체 스택 추적을 보면 문제가있는 곳을 찾을 수 있습니다. –
디버그 모드에서 스택 추적을 얻을 수 없으므로 마지막으로 스택 추적을 인쇄하는 또 다른'log.error (e.getMessage(), e)'를 추가했습니다. 주입 된 클래스 중 하나에이 "숨겨진"NullPointerException을 발생시키는 문제가있는 것처럼 보입니다. –
Odd. 스택 추적이나 다른 코드를 통해 더 많은 정보가 도움이 될 것입니다. – LightGuard