Java 访问实例列表返回NullPointerException

Java 访问实例列表返回NullPointerException,java,jboss7.x,cdi,Java,Jboss7.x,Cdi,我尝试用基于CDI的方法替换工厂类,该工厂类使用反射按字符串名返回类 因此,我将@Inject@任何可能的实例indicates作为类变量。然后在getIDataInstanceByClassname(String className)中,我通过Class.forName创建一个实例,并将其与possibleCandidates列表中的每个实例进行比较,然后返回一个匹配的“可注入”实例 但是,访问possibleCandidates最终会出现NullPointerException。我是为循环启

我尝试用基于CDI的方法替换工厂类,该工厂类使用反射按字符串名返回类

因此,我将
@Inject@任何可能的实例indicates
作为类变量。然后在
getIDataInstanceByClassname(String className)
中,我通过
Class.forName
创建一个实例,并将其与
possibleCandidates
列表中的每个实例进行比较,然后返回一个匹配的“可注入”实例

但是,访问
possibleCandidates
最终会出现
NullPointerException
。我是为循环启动一个
,还是使用
possibleCandidates.iterator()
。但是,检查变量不会返回null,而是返回填充了各种值的
InstanceImpl

为什么访问它会产生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 ) { ... }
}
@实例
@任何
可能的私有实例条件;
公共IData getClassByClassname(字符串className){
试一试{
Class clazz=Class.forName(className);
迭代器it=possibleCandidates.Iterator();//此处抛出NPE
while(it.hasNext()){
IDataDataInstance=it.next();
if(dataInstance.getClass().equals(clazz)){
返回数据实例;
}
}
}
捕获(例外e){…}
}

该列表中有一个类,它在构造时生成一个NullPointerException,导致对实例列表的任何访问失败。在调试模式下,我看不到NPE的原因,但当我添加一些日志记录时,根本原因很清楚


所以,记住孩子们:总是用它来重现捕捉块或圆顶中的异常。但是,如果不将原始异常作为原因放入其中,就永远不要抛出不同的异常。

查看代码和完整的堆栈跟踪,将帮助您(和我们)找到问题所在。无法在调试模式下获取堆栈跟踪,因此我添加了另一个
log.error(e.getMessage(),e)
,最终打印堆栈跟踪。似乎其中一个注入类中存在问题,导致出现这种“隐藏”的NullPointerException.Odd。通过堆栈跟踪或其他代码提供更多信息会有所帮助。