【问题标题】:Stack trace as String堆栈跟踪作为字符串
【发布时间】:2013-09-04 00:08:22
【问题描述】:

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

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

java.lang.ClassNotFoundException: com.app.Application

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

这是我的代码的一部分,被trycatch 包围:

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

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

【问题讨论】:

  • 检查我提供的更新答案。您可以将跟踪转换为字符串格式供您显示。
  • 使用ExceptionObject.printStackTrace();
  • 只是堆栈跟踪到字符串部分:stackoverflow.com/questions/1149703/…

标签: java exception


【解决方案1】:

您需要拨打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()

【讨论】:

  • 太棒了!帮助我解决了 Android 中的 InputStream 错误 :)
【解决方案2】:

试试e.printStackTrace(),它会为您的异​​常打印跟踪,并带有提到的行

【讨论】:

    【解决方案3】:

    这是完整的异常消息。

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

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

    【讨论】:

      【解决方案4】:

      如果您没有使用任何记录器(Log4j 或 oracle 记录器 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); 
      }
      

      【讨论】:

        【解决方案5】:

        e.printStackTrace 将给出完整的堆栈跟踪

        【讨论】:

          【解决方案6】:

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

              CharArrayWriter cw = new CharArrayWriter();
              PrintWriter w = new PrintWriter(cw);
              e.printStackTrace(w);
              w.close();
              String trace = cw.toString();
          

          【讨论】:

            【解决方案7】:
            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();
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-11-12
              • 2013-06-23
              • 2015-09-10
              • 1970-01-01
              • 2011-05-25
              • 2011-05-13
              相关资源
              最近更新 更多