我正在使用Eclipse中的调试器来帮助我完成一个Java项目。我看到一个NullPointerException,其“cause”字段/属性(不确定正确的术语是什么)指向另一个NullPointerException,其原因指向另一个,依此类推。我已经跟踪了大约100个这样的堆栈而没有到达底部。
我不一定要求帮助修复错误,但为什么这个看似无底的堆栈会出现?
对于所有人来说,它们的值是“NullPointerException(id 38)”。是否只有一个实例指的是自己?
干杯!
答案 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指向它自己。
我已经看过几次了。有时一个例外只是提到自己是一个原因。我还没有真正调查过为什么会这样。