我的 Java 代码实例捕获了 NullPointerException
,但是当我尝试记录 StackTrace (基本上最终调用 Throwable.printStackTrace()
)时,我得到的是:
java.lang.NullPointerException
有没有其他人遇到过这个?我尝试用谷歌搜索“java 空指针空堆栈跟踪”,但没有遇到这样的事情。
原文由 Edward Shtern 发布,翻译遵循 CC BY-SA 4.0 许可协议
我的 Java 代码实例捕获了 NullPointerException
,但是当我尝试记录 StackTrace (基本上最终调用 Throwable.printStackTrace()
)时,我得到的是:
java.lang.NullPointerException
有没有其他人遇到过这个?我尝试用谷歌搜索“java 空指针空堆栈跟踪”,但没有遇到这样的事情。
原文由 Edward Shtern 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如您在评论中提到的,您正在使用 log4j。我(无意中)发现了一个我写过的地方
LOG.error(exc);
而不是典型的
LOG.error("Some informative message", e);
通过懒惰或者可能只是不考虑它。不幸的是,它的行为并不像您预期的那样。记录器 API 实际上将 Object 作为第一个参数,而不是字符串 - 然后它在参数上调用 toString() 。因此,它没有获得漂亮的堆栈跟踪,而是打印出 toString——这在 NPE 的情况下是非常无用的。
也许这就是你正在经历的?
原文由 Steven Schlansker 发布,翻译遵循 CC BY-SA 2.5 许可协议
15 回答8.4k 阅读
3 回答3.2k 阅读✓ 已解决
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
2 回答537 阅读✓ 已解决
2 回答739 阅读✓ 已解决
2 回答615 阅读✓ 已解决
2 回答927 阅读✓ 已解决
3 回答3.2k 阅读✓ 已解决
您可能正在使用 HotSpot JVM(最初由 Sun Microsystems,后来被 Oracle 收购,是 OpenJDK 的一部分),它执行了大量优化。要取回堆栈跟踪,您需要将选项
-XX:-OmitStackTraceInFastThrow
传递给 JVM。优化是,当第一次发生异常(通常是 NullPointerException)时,会打印完整的堆栈跟踪,并且 JVM 会记住堆栈跟踪(或者可能只是代码的位置)。当该异常经常发生时,将不再打印堆栈跟踪,以实现更好的性能并且不使用相同的堆栈跟踪淹没日志。
要了解这是如何在 HotSpot JVM 中实现的,请 获取它的副本 并搜索全局变量
OmitStackTraceInFastThrow
。上次我查看代码时(2019 年),它位于文件 graphKit.cpp 中。