【问题标题】:Accessing list of Instances returns NullPointerException访问实例列表返回 NullPointerException
【发布时间】: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。
  • 奇数。通过堆栈跟踪或其他代码获得更多信息会很有帮助。

标签: java jboss7.x cdi


【解决方案1】:

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

所以,记住孩子们:总是在 catch 块中重新抛出异常,或者用它来做一些事情。但是千万不要在没有将原始异常作为原因放入其中的情况下抛出不同的异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多