我的Java代码实例捕获了NullPointerException,但是当我尝试登录StackTrace(基本上最终调用Throwable.printStackTrace())时,我得到的是:
NullPointerException
Throwable.printStackTrace()
java.lang.NullPointerException
还有其他人遇到吗?我尝试谷歌搜索“ java空指针空堆栈跟踪”,但没有遇到这样的事情。
你可能正在使用HotSpot JVM(最初由Sun Microsystems,后来由Oracle收购,又是OpenJDK的一部分),它执行了很多优化。要获取堆栈跟踪,需要将选项传递-XX:-OmitStackTraceInFastThrow给JVM。
-XX:-OmitStackTraceInFastThrow
优化是,当第一次发生异常(通常为NullPointerException)时,将打印完整的堆栈跟踪,并且JVM会记住堆栈跟踪(或者可能只是代码的位置)。当该异常经常发生时,将不再打印堆栈跟踪,这既可以实现更好的性能,又不会使相同的堆栈跟踪充满日志。
要查看在HotSpot JVM中是如何实现的,请获取它的副本并搜索global变量OmitStackTraceInFastThrow。上一次(在2019年)查看代码时,它在graphKit.cpp文件中。
OmitStackTraceInFastThrow