我已经有我们的Java代码的实例捕捉一个NullPointerException,但当我试图记录StackTrace(基本上最终调用Throwable.printStackTrace()),我得到的是:
java.lang.NullPointerException
有人遇到过吗?我试着在谷歌上搜索“java空指针空堆栈跟踪”,但没有遇到这样的东西。
我已经有我们的Java代码的实例捕捉一个NullPointerException,但当我试图记录StackTrace(基本上最终调用Throwable.printStackTrace()),我得到的是:
java.lang.NullPointerException
有人遇到过吗?我试着在谷歌上搜索“java空指针空堆栈跟踪”,但没有遇到这样的东西。
当前回答
我们在过去看到过同样的行为。事实证明,由于某些疯狂的原因,如果在使用Log一段时间后,NullPointerException在代码中的同一位置多次出现。error(String, Throwable)将停止包含全堆栈跟踪。
再往前看看你的日志。你可能会找到罪魁祸首。
编辑:这个bug听起来是相关的,但它在很久以前就被修复了,这可能不是原因。
其他回答
VM停止输出多次抛出的异常的堆栈跟踪。这是发生在C2编译中的优化之一。
根据OpenJDK源代码,此优化应用于以下例外情况:
nullpointerexception -ArithmeticException -ArrayIndexOutOfBoundsException -ArrayStoreException classcastexception
这将输出异常,只用于调试,你应该更好地处理你的异常。
import java.io.PrintWriter;
import java.io.StringWriter;
public static String getStackTrace(Throwable t)
{
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw, true);
t.printStackTrace(pw);
pw.flush();
sw.flush();
return sw.toString();
}
我们在过去看到过同样的行为。事实证明,由于某些疯狂的原因,如果在使用Log一段时间后,NullPointerException在代码中的同一位置多次出现。error(String, Throwable)将停止包含全堆栈跟踪。
再往前看看你的日志。你可能会找到罪魁祸首。
编辑:这个bug听起来是相关的,但它在很久以前就被修复了,这可能不是原因。
正如您在评论中提到的,您正在使用log4j。我(无意中)发现了一个我写过东西的地方
LOG.error(exc);
而不是典型的
LOG.error("Some informative message", e);
因为懒惰,或者可能只是没有想过。不幸的是,它的行为并不如您所期望的那样。记录器API实际上将Object作为第一个参数,而不是字符串——然后它对该参数调用toString()。因此,它没有得到漂亮的堆栈跟踪,只是打印出toString——在NPE的情况下,这是非常无用的。
也许这就是你正在经历的?
toString()只返回异常名称和可选消息。我建议你打电话
exception.printStackTrace()
要转储消息,或者如果你需要血腥的细节:
StackTraceElement[] trace = exception.getStackTrace()