【发布时间】:2012-08-10 10:25:01
【问题描述】:
我尝试用基于 CDI 的方法替换我们的 Factory 类,该类使用基于字符串名称的反射返回类。
所以我将@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。 -
奇数。通过堆栈跟踪或其他代码获得更多信息会很有帮助。