
Java中没有StackTrace的NullPointerException
我有我们的Java代码的例子捕获NullPointerException,但当我尝试记录StackTrace(基本上最终调用Throwable.printStackTrace())时,我得到的是:
java.lang.NullPointerException
还有其他人遇到过这个吗?我试着谷歌搜索“java空指针空堆栈跟踪”,但没有遇到这种的事情。
喵喔喔
浏览 490回答 3


慕盖茨4494581
您或许正在使用HotSpot JVM(最初由Sun Microsystems,后来由Oracle收购,是OpenJDK的一部分),它执行了长期优化。要获得堆栈跟踪,您应该将选项传递-XX:-OmitStackTraceInFastThrow给JVM。优化是当第一次发生异常(通常是NullPointerException)时,将打印完整的堆栈跟踪,并且JVM会记住堆栈跟踪(或者也许也是代码的位置)。当该异常频繁出现时,不再打印堆栈跟踪,以推动更好的性能,并且不会使用同样的堆栈跟踪泛洪日志。要知道怎样在HotSpot JVM中谋求它,请获取它的副本并搜索全局函数OmitStackTraceInFastThrow。上次我查看代码(在2019年),它位于文件graphKit.cpp中。


牧羊人nacy
正如您在评论中提及的,您正在使用log4j。我(无意中)发现了我写过的地方LOG.error(exc);而不是典型的LOG.error("Some informative message", e);通过懒惰甚至或许也是不考量它。不幸的是,它没有像你期望的那种表现。记录器API实际上将Object作为第一个参数,而不是字符串 - 然后它在参数上调用toString()。因此java stack trace,它不是获得漂亮的漂亮堆栈跟踪,而是打印出toString - 在NPE的状况下它是非常无用的。也许这就是你所经历的?


慕圣8478803
我们过去曾见到同样的行为。事实证明,出于一些疯狂的缘由java stack trace,如果NullPointerException多次发生在代码中的同样位置,经过一段时间使用Log.error(String, Throwable)会中止包括完整的堆栈跟踪。尝试进一步查看日志。你可能会找到罪魁祸首。
打开App,查看更多内容
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/shouji/article-141183-1.html
为什么呢
可恶