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(); }