将Throwable.getStackTrace()的结果转换为描述堆栈跟踪的字符串最简单的方法是什么?


当前回答

private String getCurrentStackTraceString() {
    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    return Arrays.stream(stackTrace).map(StackTraceElement::toString)
            .collect(Collectors.joining("\n"));
}

其他回答

第一组评论中巧妙的狙击非常有趣,但这真的取决于你想做什么。如果您还没有正确的库,那么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)

这救了我的命。谢谢阿玛的提示!

private String getCurrentStackTraceString() {
    StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
    return Arrays.stream(stackTrace).map(StackTraceElement::toString)
            .collect(Collectors.joining("\n"));
}

这应该是有效的:

StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();

警告:不包括原因(通常是有用的位!)

public String stackTraceToString(Throwable e) {
    StringBuilder sb = new StringBuilder();
    for (StackTraceElement element : e.getStackTrace()) {
        sb.append(element.toString());
        sb.append("\n");
    }
    return sb.toString();
}

如果您使用的是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。