printStackTrace()和toString()之间的区别

And*_*eas 52 java

我很好奇printStackTrace()和toString()之间的区别.乍一看,他们似乎完全一样.

码:

try {
// Some code
} catch (Exception e)
   e.printStackTrace();
   // OR
   e.toString()
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*aux 86

不,有一个重要的区别!使用toString,您只能拥有异常类型和错误消息.使用printStackTrace()可以获得异常的整个堆栈跟踪,这对调试非常有用.

System.out.println(toString())的示例:

java.io.FileNotFoundException: yourFile.txt (The system cannot find the file specified)
Run Code Online (Sandbox Code Playgroud)

printStackTrace()的示例:

java.io.FileNotFoundException: yourFile.txt (The system cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(FileInputStream.java:106)
at java.io.FileReader.(FileReader.java:55)
at ReadFromFile.main(ReadFromFile.java:14)
Run Code Online (Sandbox Code Playgroud)

要创建整个堆栈跟踪的字符串,我通常使用此方法:

public static String exceptionStacktraceToString(Exception e)
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PrintStream ps = new PrintStream(baos);
    e.printStackTrace(ps);
    ps.close();
    return baos.toString();
}
Run Code Online (Sandbox Code Playgroud)

另请注意,简单地调用toString()只返回一个字符串,并且不会打印任何内容.

  • @andreas:检查我的编辑.我为此写了一个方法. (2认同)

Ren*_*aud 56

要将StackTrace转换为String,我使用的是一个更短的实现:

public static String exceptionStacktraceToString(Exception e)
{
    return Arrays.toString(e.getStackTrace());
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此输出与 printStackTrace() 不同,因为 printStackTrace() 递归地包含其原因的堆栈跟踪,而 getStackTrace() 则不包含。 (2认同)

Jon*_*eet 13

不,这有很大的不同.如果你只是打电话toString,它将不会打印任何东西 - 它只会返回一个字符串.一个捕获块只是e.toString();没用.(正如Martijn指出的那样,还有堆栈跟踪的问题.)

我个人也不会使用 - 我会使用一个日志库(log4j,java.util.logging等),它将Throwable自身作为参数,并将有用地格式化 - 包括堆栈跟踪,可能被截断以避免重复.