无底堆栈的NullPointerExceptions

时间:2014-02-11 18:57:14

标签: java eclipse nullpointerexception

我正在使用Eclipse中的调试器来帮助我完成一个Java项目。我看到一个NullPointerException,其“cause”字段/属性(不确定正确的术语是什么)指向另一个NullPointerException,其原因指向另一个,依此类推。我已经跟踪了大约100个这样的堆栈而没有到达底部。

我不一定要求帮助修复错误,但为什么这个看似无底的堆栈会出现?

对于所有人来说,它们的值是“NullPointerException(id 38)”。是否只有一个实例指的是自己?

干杯!

2 个答案:

答案 0 :(得分:0)

您可以尝试catch例外,然后通过

运行
  public static Throwable getRootCause(Throwable throwable) {
    Throwable cause;
    while ((cause = throwable.getCause()) != null) {
      throwable = cause;
    }
    return throwable;
  }

并查看是否有底部。 getRootCause(evilNPE).printStackTrace()

(代码从Guava Throwables#getRootCause()被盗)

异常应始终有根本原因,从技术上讲,创建无限循环应该是可能的,但我认为你需要反射或其他非常规的非常规使用来实现这一点。如果确实如此,你将永远在上面的方法中循环。

您可能正在以类似

的方式处理递归
void recursion(int steps) {
    try {
        if (steps > 0)
            recursion(steps - 1);
        else
            throw new Exception("Hidden root");
    } catch (Exception e) {
        throw new Exception("Wrap Exception because we can", e);
    }
}

将每个异常捕获,包装并传播到下一个外部步骤。

另一方面,你可能误解了某些东西,例如:您遵循对this的引用,该引用再次引用this

答案 1 :(得分:0)

值始终以(id 38)结尾的事实告诉你是的,它指的是它自己。括号中的数字表示对象实例。所以NullPointerException指向它自己。

我已经看过几次了。有时一个例外只是提到自己是一个原因。我还没有真正调查过为什么会这样。