如何最简单地将Throwable.getStackTrace()
的结果转换为描述堆栈跟踪的字符串?
如何最简单地将Throwable.getStackTrace()
的结果转换为描述堆栈跟踪的字符串?
使用 Throwable.printStackTrace(PrintWriter pw)
将堆栈跟踪发送到适当的 writer。
import java.io.StringWriter;
import java.io.PrintWriter;
// ...
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
String sStackTrace = sw.toString(); // stack trace as a string
System.out.println(sStackTrace);
StringWriter
和PrintWriter
吗? - Muhammad Gelbana可以使用以下方法将异常堆栈转换为字符串:Exception
。这个类在Apache commons-lang中可用,这是许多流行开源项目都依赖的最常见的库。
org.apache.commons.lang.exception.ExceptionUtils.getStackTrace(Throwable)
org.apache.commons.lang3.exception.ExceptionUtils
。 - schmmdExceptionUtils.getFullStackTrace(e)
。 - takanuva15这应该可以工作:
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
printStackTrace
方法应该只返回字符串,让用户决定是否打印它,这样会更好 :) - dmitryprintXXX()
的方法应该打印XXX。 - user207421如果你正在为Android开发,更简单的方法是使用这个:
import android.util.Log;
String stackTrace = Log.getStackTraceString(exception);
格式与 getStacktrace 相同,例如:
09-24 16:09:07.042: I/System.out(4844): java.lang.NullPointerException
09-24 16:09:07.042: I/System.out(4844): at com.temp.ttscancel.MainActivity.onCreate(MainActivity.java:43)
09-24 16:09:07.042: I/System.out(4844): at android.app.Activity.performCreate(Activity.java:5248)
09-24 16:09:07.043: I/System.out(4844): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)
09-24 16:09:07.043: I/System.out(4844): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)
09-24 16:09:07.043: I/System.out(4844): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)
09-24 16:09:07.043: I/System.out(4844): at android.app.ActivityThread.access$800(ActivityThread.java:139)
09-24 16:09:07.043: I/System.out(4844): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)
09-24 16:09:07.043: I/System.out(4844): at android.os.Handler.dispatchMessage(Handler.java:102)
09-24 16:09:07.043: I/System.out(4844): at android.os.Looper.loop(Looper.java:136)
09-24 16:09:07.044: I/System.out(4844): at android.app.ActivityThread.main(ActivityThread.java:5097)
09-24 16:09:07.044: I/System.out(4844): at java.lang.reflect.Method.invokeNative(Native Method)
09-24 16:09:07.044: I/System.out(4844): at java.lang.reflect.Method.invoke(Method.java:515)
09-24 16:09:07.044: I/System.out(4844): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
09-24 16:09:07.044: I/System.out(4844): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
UnknownHostException
,则返回一个空字符串。请参见https://developer.android.com/reference/android/util/Log。 - Pavel ChuchuvaThrowables
类如果您拥有实际的Throwable
实例,则Google Guava提供Throwables.getStackTraceAsString()
。
示例:
String s = Throwables.getStackTraceAsString ( myException ) ;
警告:不包括原因(通常是有用的部分!)
public String stackTraceToString(Throwable e) {
StringBuilder sb = new StringBuilder();
for (StackTraceElement element : e.getStackTrace()) {
sb.append(element.toString());
sb.append("\n");
}
return sb.toString();
}
对我来说,最干净和最简单的方式是:
import java.util.Arrays;
Arrays.toString(e.getStackTrace());
public static String getStackTrace(Throwable t) {
StringWriter sw = new StringWriter();
t.printStackTrace(new PrintWriter(sw));
return sw.toString();
}
StringWriter
和PrintWriter
对象应该被关闭...(或者只需关闭PrintWriter
,因为关闭它应该也会关闭StringWriter
)。 - Ericcatch (Exception e) {
StackTraceElement[] stack = e.getStackTrace();
String exception = "";
for (StackTraceElement s : stack) {
exception = exception + s.toString() + "\n\t\t";
}
System.out.println(exception);
// then you can send the exception string to a external file.
}
将堆栈跟踪打印到PrintStream
,然后将其转换为String
:
// ...
catch (Exception e)
{
ByteArrayOutputStream out = new ByteArrayOutputStream();
e.printStackTrace(new PrintStream(out));
String str = new String(out.toByteArray());
System.out.println(str);
}