我已经有我们的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听起来是相关的,但它在很久以前就被修复了,这可能不是原因。