我已经有我们的Java代码的实例捕捉一个NullPointerException,但当我试图记录StackTrace(基本上最终调用Throwable.printStackTrace()),我得到的是:

java.lang.NullPointerException

有人遇到过吗?我试着在谷歌上搜索“java空指针空堆栈跟踪”,但没有遇到这样的东西。


当前回答

例外。toString不给你StackTrace,它只返回

这是一个简短的描述扔。 结果是: *该对象的类名 * ": "(冒号加空格) *调用该对象的getLocalizedMessage()方法的结果


使用异常。而不是printStackTrace来输出StackTrace。

其他回答

例外。toString不给你StackTrace,它只返回

这是一个简短的描述扔。 结果是: *该对象的类名 * ": "(冒号加空格) *调用该对象的getLocalizedMessage()方法的结果


使用异常。而不是printStackTrace来输出StackTrace。

toString()只返回异常名称和可选消息。我建议你打电话

exception.printStackTrace()

要转储消息,或者如果你需要血腥的细节:

 StackTraceElement[] trace = exception.getStackTrace()

这将输出异常,只用于调试,你应该更好地处理你的异常。

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();
    }

正如您在评论中提到的,您正在使用log4j。我(无意中)发现了一个我写过东西的地方

LOG.error(exc);

而不是典型的

LOG.error("Some informative message", e);

因为懒惰,或者可能只是没有想过。不幸的是,它的行为并不如您所期望的那样。记录器API实际上将Object作为第一个参数,而不是字符串——然后它对该参数调用toString()。因此,它没有得到漂亮的堆栈跟踪,只是打印出toString——在NPE的情况下,这是非常无用的。

也许这就是你正在经历的?

另一个建议——如果您正在使用Eclipse,您可以在NullPointerException本身上设置一个断点(在Debug透视图中,转到“Breakpoints”选项卡并单击有一个!在它)

检查“caught”和“uncaught”选项-现在当你触发NPE时,你会立即断点,然后你可以逐步查看它是如何被处理的,以及为什么你没有得到堆栈跟踪。