没有 StackTrace 的 Java 中的 NullPointerException

新手上路,请多包涵

我的 Java 代码实例捕获了 NullPointerException ,但是当我尝试记录 StackTrace (基本上最终调用 Throwable.printStackTrace() )时,我得到的是:

 java.lang.NullPointerException

有没有其他人遇到过这个?我尝试用谷歌搜索“java 空指针空堆栈跟踪”,但没有遇到这样的事情。

原文由 Edward Shtern 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 681
2 个回答

您可能正在使用 HotSpot JVM(最初由 Sun Microsystems,后来被 Oracle 收购,是 OpenJDK 的一部分),它执行了大量优化。要取回堆栈跟踪,您需要将选项 -XX:-OmitStackTraceInFastThrow 传递给 JVM。

优化是,当第一次发生异常(通常是 NullPointerException)时,会打印完整的堆栈跟踪,并且 JVM 会记住堆栈跟踪(或者可能只是代码的位置)。当该异常经常发生时,将不再打印堆栈跟踪,以实现更好的性能并且不使用相同的堆栈跟踪淹没日志。

要了解这是如何在 HotSpot JVM 中实现的,请 获取它的副本 并搜索全局变量 OmitStackTraceInFastThrow 。上次我查看代码时(2019 年),它位于文件 graphKit.cpp 中。

原文由 Roland Illig 发布,翻译遵循 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题