NullPointerException in Java with no StackTrace

2022-08-31 04:38:12

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

java.lang.NullPointerException

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


答案 1

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

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

要了解如何在 HotSpot JVM 中实现此功能,请获取其副本并搜索全局变量 。上次我看代码(在2019年),它是在文件graphKit中.cppOmitStackTraceInFastThrow


答案 2

正如您在评论中提到的,您正在使用log4j。我(无意中)发现了一个我写过的地方

LOG.error(exc);

而不是典型的

LOG.error("Some informative message", e);

通过懒惰,或者只是不去想它。不幸的是,它的行为并不像你预期的那样。记录器 API 实际上将 Object 作为第一个参数,而不是字符串 - 然后它对参数调用 toString()。因此,它不是获得漂亮的堆栈跟踪,而是打印出toString - 在NPE的情况下,这是非常无用的。

也许这就是你正在经历的?


推荐