39

如何在 Java 中获取完整的异常消息?

我正在创建一个 Java 应用程序。如果有运行时异常,会弹出一个JDialog带有 a 的。JTextArea我试图在我的应用程序中创建运行时异常,但显示异常消息的文本区域如下所示:

java.lang.ClassNotFoundException: com.app.Application

但是,我希望我的文本区域显示如下内容:

在此处输入图像描述

这是我的代码的一部分,由tryand包围catch

String ex = e.toString();
this.addText(ex);

我尝试使用e.getLocalizedMessage()and e.getMessage(),但这些都不起作用。

4

7 回答 7

87

您需要致电Throwable#printStackTrace(PrintWriter);

try{

}catch(Exception ex){
    String message = getStackTrace(ex);
}

public static String getStackTrace(final Throwable throwable) {
     final StringWriter sw = new StringWriter();
     final PrintWriter pw = new PrintWriter(sw, true);
     throwable.printStackTrace(pw);
     return sw.getBuffer().toString();
}

您还可以使用提供此功能的 commons-lang-2.2.jar Apache Commons Lang 库:

public static String getStackTrace(Throwable throwable)
Gets the stack trace from a Throwable as a String.

ExceptionUtils#getStackTrace()

于 2013-08-31T10:00:05.833 回答
5

如果您没有使用任何记录器(Log4j 或 oracle logger api),那么您可以使用以下语句打印完整的异常消息

try{
       // statement which you want to monitor 

}catch(Exception e){
    e.printStackTrace()
    // OR System.err.println(e.getStackTrace());
    // OR System.err.println(e);
    // OR System.err.println(e.getMessage());
    // OR System.err.println(e.getCause());
}

如果您使用的是 Logger API,请使用以下语句

try{

         // statement which you want to monitor 

}catch(Exception e){
  log.error(e,e); 
}
于 2013-08-31T10:01:29.403 回答
5

要将堆栈跟踪转换为字符串,您可以使用以下行:

    CharArrayWriter cw = new CharArrayWriter();
    PrintWriter w = new PrintWriter(cw);
    e.printStackTrace(w);
    w.close();
    String trace = cw.toString();
于 2013-08-31T10:06:54.930 回答
2

e.printStackTrace将提供完整的堆栈跟踪

于 2013-08-31T10:03:36.193 回答
2
public static String getStackMsg(Throwable e) {
    StringBuffer sb = new StringBuffer();
    sb.append(e.toString()).append("\n");
    StackTraceElement[] stackArray = e.getStackTrace();

    for(int i = 0; i < stackArray.length; ++i) {
        StackTraceElement element = stackArray[i];
        sb.append(element.toString() + "\n");
    }

    return sb.toString();
}
于 2017-08-22T07:15:54.873 回答
1

试试看e.printStackTrace(),它会打印你的异常的跟踪,上面提到的行

于 2013-08-31T10:00:47.307 回答
1

这是完整的异常消息。

如果您想了解更多信息,请尝试 e.printStackTrace()

然后你会得到你在你发布的图片上看到的东西

于 2013-08-31T10:00:58.943 回答