【发布时间】:2010-11-07 18:03:02
【问题描述】:
我最近发现了一个导致 NullPointerException 的错误。使用标准 slf4j 语句捕获并记录异常。代码如下:
for(Action action : actions.getActions()) {
try {
context = action.execute(context);
} catch (Exception e) {
logger.error("...", e);
break;
}
}
如您所见,没什么特别的。但是,在我们拥有的所有异常日志语句中,只有这一条不会打印堆栈跟踪。它只打印消息(表示为“...”)和异常类的名称(java.lang.NullPointerException)。
由于异常的堆栈跟踪是延迟加载的,我认为可能存在某种指令重新排序问题,并决定在日志语句之前调用 e.getStackTrace()。这没什么区别。
所以我决定在启用调试代理的情况下重新启动。但是,因为我什至附加到进程,我注意到现在堆栈跟踪正在打印。很明显,调试代理的存在导致一些额外的调试信息可用。
从那时起,我已经修复了异常的根本原因。但是我想了解为什么没有调试器就无法使用堆栈跟踪。有人知道吗?
澄清:这不是日志记录问题。想象一下同样的 try/catch 子句,但是在 catch 中,我打印了以下值:
e.getStackTrace().length
如果没有调试器,它会打印“0”,如果有调试器,它会打印一个正数(在本例中为 9)。
更多信息:这发生在 JDK 1.6.0_13、64bit、amd64、linux 2.6.9 上
【问题讨论】:
-
你用的是什么虚拟机?这种行为听起来非常很奇怪。
-
JDK 1.6.0_13,Linux 2.6.9 上的 64 位
-
当你自己在 try 中“抛出新的 NullPointerException()”会发生什么?
-
尝试记录这些动作,这样你就可以知道是哪个动作导致了这个
-
我已经解决了根本问题。我只想解释一下这种行为。
标签: java logging stack-trace nullpointerexception