1

我试图用基于 CDI 的方法替换使用反射通过字符串名称返回类的工厂类。

所以我把一个@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 ) { ... }
}
4

1 回答 1

2

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

所以,记住孩子们:总是在 catch 块中重新抛出异常或用它做一些事情。但是,如果不将原始异常作为原因放入其中,则永远不要抛出不同的异常。

于 2012-08-11T13:40:33.040 回答