将Throwable.getStackTrace()的结果转换为描述堆栈跟踪的字符串最简单的方法是什么?
当前回答
第一组评论中巧妙的狙击非常有趣,但这真的取决于你想做什么。如果您还没有正确的库,那么3行代码(如D.Wroblewski的答案)是完美的。OTOH,如果您已经拥有apache.commons库(大多数大型项目都有),那么Amar的答案会更短。好的,您可能需要十分钟才能获得库并正确安装它(如果您知道正在做什么,则不到一分钟)。但时间在滴答作响,所以你可能没有时间来腾出时间。Jarek Przygódzki有一个有趣的警告——“如果您不需要嵌套异常”。
但如果我确实需要完整的堆栈跟踪,嵌套的和所有的呢?在这种情况下,秘诀是使用apache.common的getFullStackTrace(请参见http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html#getFullStackTrace%28java.lang.Throwable%29)
这救了我的命。谢谢阿玛的提示!
其他回答
解决方案是将数组的stackTrace转换为字符串数据类型。请参见以下示例:
import java.util.Arrays;
try{
}catch(Exception ex){
String stack = Arrays.toString(ex.getStackTrace());
System.out.println("stack "+ stack);
}
如果你是为Android开发的,一个更简单的方法是使用这个:
import android.util.Log;
String stackTrace = Log.getStackTraceString(exception);
格式与getStacktrace相同,例如。
09-24 16:09:07.042:I/System.out(4844):java.lang.NullPointerException09-24 16:09:07.042:I/System.out(4844):在com.temp.ttscancel.MainActivity.onCreate(MainActivity.java:43)09-24 16:09:07.042:I/System.out(4844):在android.app.Activity.performCreate(Activity.java:5248)09-24 16:09:07.043:I/System.out(4844):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110)09-24 16:09:07.043:I/System.out(4844):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162)09-24 16:09:07.043:I/System.out(4844):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257)09-24 16:09:07.043:I/System.out(4844):在android.app.ActivityThread.access$800(ActivityThread.java:139)09-24 16:09:07.043:I/System.out(4844):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210)09-24 16:09:07.043:I/System.out(4844):在android.os.Handler.dispatchMessage(Handler.java:102)09-24 16:09:07.043:I/System.out(4844):在android.os.Looper.lop(Looper.java:136)09-24 16:09:07.044:I/System.out(4844):在android.app.ActivityThread.main(ActivityThread.java:5097)09-24 16:09:07.044:I/System.out(4844):在java.lang.reflect.Method.invokeNative(本机方法)09-24 16:09:07.044:I/System.out(4844):在java.lang.reflect.Method.invoke(Method.java:515)09-24 16:09:07.044:I/System.out(4844):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)09-24 16:09:07.044:I/System.out(4844):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
如果您使用的是Java 8,请尝试
Arrays.stream(e.getStackTrace())
.map(s->s.toString())
.collect(Collectors.joining("\n"));
您可以找到Throwable.java提供的getStackTrace()函数的代码:
public StackTraceElement[] getStackTrace() {
return getOurStackTrace().clone();
}
对于StackTraceElement,它提供如下的toString():
public String toString() {
return getClassName() + "." + methodName +
(isNativeMethod() ? "(Native Method)" :
(fileName != null && lineNumber >= 0 ?
"(" + fileName + ":" + lineNumber + ")" :
(fileName != null ? "("+fileName+")" : "(Unknown Source)")));
}
因此,只需使用“\n”连接StackTraceElement。
这应该是有效的:
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();
第一组评论中巧妙的狙击非常有趣,但这真的取决于你想做什么。如果您还没有正确的库,那么3行代码(如D.Wroblewski的答案)是完美的。OTOH,如果您已经拥有apache.commons库(大多数大型项目都有),那么Amar的答案会更短。好的,您可能需要十分钟才能获得库并正确安装它(如果您知道正在做什么,则不到一分钟)。但时间在滴答作响,所以你可能没有时间来腾出时间。Jarek Przygódzki有一个有趣的警告——“如果您不需要嵌套异常”。
但如果我确实需要完整的堆栈跟踪,嵌套的和所有的呢?在这种情况下,秘诀是使用apache.common的getFullStackTrace(请参见http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/exception/ExceptionUtils.html#getFullStackTrace%28java.lang.Throwable%29)
这救了我的命。谢谢阿玛的提示!
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap