我已经有我们的Java代码的实例捕捉一个NullPointerException,但当我试图记录StackTrace(基本上最终调用Throwable.printStackTrace()),我得到的是:
java.lang.NullPointerException
有人遇到过吗?我试着在谷歌上搜索“java空指针空堆栈跟踪”,但没有遇到这样的东西。
我已经有我们的Java代码的实例捕捉一个NullPointerException,但当我试图记录StackTrace(基本上最终调用Throwable.printStackTrace()),我得到的是:
java.lang.NullPointerException
有人遇到过吗?我试着在谷歌上搜索“java空指针空堆栈跟踪”,但没有遇到这样的东西。
当前回答
例外。toString不给你StackTrace,它只返回
这是一个简短的描述扔。 结果是: *该对象的类名 * ": "(冒号加空格) *调用该对象的getLocalizedMessage()方法的结果
使用异常。而不是printStackTrace来输出StackTrace。
其他回答
另一个建议——如果您正在使用Eclipse,您可以在NullPointerException本身上设置一个断点(在Debug透视图中,转到“Breakpoints”选项卡并单击有一个!在它)
检查“caught”和“uncaught”选项-现在当你触发NPE时,你会立即断点,然后你可以逐步查看它是如何被处理的,以及为什么你没有得到堆栈跟踪。
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();
}
toString()只返回异常名称和可选消息。我建议你打电话
exception.printStackTrace()
要转储消息,或者如果你需要血腥的细节:
StackTraceElement[] trace = exception.getStackTrace()
我们在过去看到过同样的行为。事实证明,由于某些疯狂的原因,如果在使用Log一段时间后,NullPointerException在代码中的同一位置多次出现。error(String, Throwable)将停止包含全堆栈跟踪。
再往前看看你的日志。你可能会找到罪魁祸首。
编辑:这个bug听起来是相关的,但它在很久以前就被修复了,这可能不是原因。