这可能是一个新手问题,但似乎每个人都使用 e.printStackTrace()
,但在异常处理时我总是使用 System.out.println(e)
。两者有何区别,为什么 e.printStackTrace()
更可取?
与@Brian所指出的不同,使用的输出流并不相同,但详细程度也不同 - 您可以尝试下面的简单测试。 输出:
使用 println
: 您只知道抛出了什么异常
java.lang.UnsupportedOperationException: 尚未实现
使用 printStackTrace
: 您还可以知道是什么引起了异常 (行号+调用堆栈)
java.lang.UnsupportedOperationException: 尚未实现
at javaapplication27.Test1.test(Test1.java:27)
at javaapplication27.Test1.main(Test1.java:19)
public static void main(String[] args){
try {
test();
} catch (UnsupportedOperationException e) {
System.out.println(e);
e.printStackTrace();
}
}
private static void test() {
throw new UnsupportedOperationException("Not yet implemented");
}
System.out.println
,那么你将把错误信息输出到stdout
而不是stderr
。myCommand 2> /tmp/errors > /tmp/results
printStackTrace()
是一个好主意,因为它会显示异常发生的位置。这对于跟踪意外错误非常有价值,因为它会直接(详细)指向您遇到错误的确切位置。yourProgram > ~/fileThatContainsStandardOutput.txt 2> ~/fileThatContainsErrors.txt
。 - Kasper van den Berge.getStackTrace()
方法可以返回一个对象数组。此外,printStackTrace
方法接受一个 PrintStream
或 PrintWriter
参数 - 因此您可以将其传递给 StringWriter 对象或任何其他流以提取数据。 - interDistSystem.err.println(e);
等同于 e.getStackTrace()
吗? - roottravellerSystem.err.println(e);
具有void返回类型,并将异常的toString()
打印到stderr中。该输出中没有堆栈跟踪。e.getStackTrace()
返回一个StackTraceElement
数组。这些都在JavaDoc中,很容易自己尝试。 - slim由于e.printStackTrace();
的输出是System.err
,而我通常将我的应用程序日志输出到文件中,因此建议您同时使用System.err
和System.out
来输出错误信息。
public static void log(Exception e) {
e.printStackTrace(); // This goes to System.err
e.printStackTrace(System.out);
}
这样你就可以在日志文件中(如果有的话)和控制台中看到错误信息。
System.out
作为输入参数将堆栈跟踪重定向到控制台。 - MartijnSystem.out.println(e)
不会给你堆栈跟踪,只会输出错误消息和异常类型,并打印到标准输出而不是错误输出。
package test;
public class Test {
public static void main(String args[]) {
try {
System.out.println(12 / 0);
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
}
}
使用System.out.println(e)
只能知道抛出了什么异常,但是使用e.printStackTrace()
可以获取关于抛出的异常以及引起它的原因的信息。