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

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

码:

try { // Some code } catch (Exception e) e.printStackTrace(); // OR e.toString() } 

不,有一个重要的区别! 使用toString,你只有exception的types和错误信息。 使用printStackTrace()会得到一个exception的整个栈跟踪,这对debugging非常有帮助。

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

 java.io.FileNotFoundException: yourFile.txt (The system cannot find the file specified) 

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) 

为了制作整个堆栈跟踪的string,我通常使用这个方法:

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

还要注意,简单地调用toString()只是返回一个string,不会打印任何东西。

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

 public static String exceptionStacktraceToString(Exception e) { return Arrays.toString(e.getStackTrace()); } 

不,有很大的差别。 如果你只是调用toString ,它将不会打印任何东西 – 它只会返回一个string。 刚刚e.toString(); catch块e.toString(); 没用。 (也有堆栈跟踪的问题,正如Martijn所指出的那样。)

就个人而言,我不会使用 – 虽然我会使用一个日志库(log4j,java.util.logging等),它将Throwable本身作为一个参数,并将其格式有效 – 包括堆栈跟踪,可能被截断,以避免重复。

toString ()在引发exception时给出exception类的名称, printStackTrace ()给出应用程序中引发exception时出现的方法执行的入口层次。

对于代码

  try { List<String> n =new ArrayList<String>(); String i = n.get(3); }catch (Exception e) { e.printStackTrace(); } } 

e.printStackTrace()会给

 java.lang.IndexOutOfBoundsException: Index: 3, Size: 0 at java.util.ArrayList.RangeCheck(ArrayList.java:547) at java.util.ArrayList.get(ArrayList.java:322) at com.o2.business.util.Trial.test(CommonUtilsTest.java:866) 

e.toString()不会打印任何东西,Jon在回答中写道。

我想你想得到Throwable.printStackTrace()的输出,就像我在找的东西。 我检查了Java源代码,并把一个String放在一起,而不是写入一个PrintStream 。 它比@MartijnCourteaux解决scheme稍微全面一些,但对我来说有点像黑客。

至于你的答案,你可以看到Throwable.toString()只是Throwable.toString()的一部分:

 public static String getStackTraceString(Throwable e) { return getStackTraceString(e, ""); } private static String getStackTraceString(Throwable e, String indent) { StringBuilder sb = new StringBuilder(); sb.append(e.toString()); sb.append("\n"); StackTraceElement[] stack = e.getStackTrace(); if (stack != null) { for (StackTraceElement stackTraceElement : stack) { sb.append(indent); sb.append("\tat "); sb.append(stackTraceElement.toString()); sb.append("\n"); } } Throwable[] suppressedExceptions = e.getSuppressed(); // Print suppressed exceptions indented one level deeper. if (suppressedExceptions != null) { for (Throwable throwable : suppressedExceptions) { sb.append(indent); sb.append("\tSuppressed: "); sb.append(getStackTraceString(throwable, indent + "\t")); } } Throwable cause = e.getCause(); if (cause != null) { sb.append(indent); sb.append("Caused by: "); sb.append(getStackTraceString(cause, indent)); } return sb.toString(); } 

这是我作为一个String使用完整的堆栈跟踪

 public static @NotNull String toString(@NotNull Throwable e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); return sw.toString(); }