堆栈跟踪作为字符串
Posted
技术标签:
【中文标题】堆栈跟踪作为字符串【英文标题】:Stack trace as String 【发布时间】:2013-09-04 00:08:22 【问题描述】:如何在 Java 中获得完整的异常消息?
我正在创建一个 Java 应用程序。如果出现运行时异常,将弹出带有JTextArea
的JDialog
。我试图在我的应用程序中创建运行时异常,但显示异常消息的文本区域如下所示:
java.lang.ClassNotFoundException: com.app.Application
但是,我希望我的文本区域显示如下内容:
这是我的代码的一部分,被try
和catch
包围:
String ex = e.toString();
this.addText(ex);
我尝试过使用e.getLocalizedMessage()
和e.getMessage()
,但这些都不起作用。
【问题讨论】:
检查我提供的更新答案。您可以将跟踪转换为字符串格式供您显示。 使用ExceptionObject.printStackTrace();
只是堆栈跟踪到字符串部分:***.com/questions/1149703/…
【参考方案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();
【讨论】:
以上是关于堆栈跟踪作为字符串的主要内容,如果未能解决你的问题,请参考以下文章