[英]Difference between printStackTrace() and toString()
我很好奇printStackTrace()和toString()之间的区别。 乍一看,他们似乎完全一样。
码:
try {
// Some code
} catch (Exception e)
e.printStackTrace();
// OR
e.toString()
}
不,有一个重要的区别! 使用toString,您只能拥有异常类型和错误消息。 使用printStackTrace()可以获得异常的整个堆栈跟踪,这对调试非常有用。
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)
要创建整个堆栈跟踪的字符串,我通常使用此方法:
public static String exceptionStacktraceToString(Exception e)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);
e.printStackTrace(ps);
ps.close();
return baos.toString();
}
另请注意,简单地调用toString()
只会返回一个字符串,并且不会打印任何内容。
要将StackTrace转换为String,我使用的是一个更短的实现:
public static String exceptionStacktraceToString(Exception e)
{
return Arrays.toString(e.getStackTrace());
}
不,这有很大的不同。 如果你只是调用toString
,它将不会打印任何东西 - 它只会返回一个字符串。 一个只有e.toString();
catch块e.toString();
没用。 (正如Martijn指出的那样,还有堆栈跟踪的问题。)
我个人也不会使用 - 我会使用一个日志库(log4j,java.util.logging等),它将Throwable
本身作为参数,并将有用地格式化 - 包括堆栈跟踪,可能被截断以避免重复。
当引发异常时, toString ()
给出异常类的名称, printStackTrace ()
给出了在应用程序中引发异常时存在的方法执行的条目层次结构。
对于代码
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解决方案更全面,但对我来说感觉有点像黑客。
至于你的答案,实际上你可以看到Throwable.toString()
仅仅是一部分Throwable.printStackTrace()
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();
}
有一个名为MgntUtils的Open Source java库(由我编写),它提供了几种方法,允许您将stacktrace作为String提取,并可选择根据参数包前缀进行过滤。 请参阅javadoc以获取方法public static java.lang.String getStacktrace(java.lang.Throwable e,boolean cutTBS,java.lang.String relatedPackage)该库可在Maven Central和Github上获得
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.