可能是一个新手问题,但每个人似乎都使用e.printStackTrace()
,但在异常处理时我总是使用System.out.println(e)
。有什么区别,为什么e.printStackTrace()
更受欢迎?
答案 0 :(得分:37)
使用的输出流与@Brian指出的输出流不同,但细节级别也不相同 - 您可以尝试使用下面的简单测试。输出:
使用println
:您只知道抛出了什么异常
java.lang.UnsupportedOperationException:尚未实现
使用printStackTrace
:您还知道导致它的原因(行号+调用堆栈)
java.lang.UnsupportedOperationException:尚未实现
在javaapplication27.Test1.test(Test1.java:27)
在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");
}
答案 1 :(得分:7)
如果您使用System.out.println
,那么您将错误转储到stdout
,而不是stderr
。
传统的做法是将错误转储到标准错误,因此您可以从错误输出中过滤正常的成功输出。这是命令行实用程序的常见做法,因此是一个好主意。
e.g。
myCommand 2> /tmp/errors > /tmp/results
会将错误写入一个日志,并将结果写入另一个日志。根据您的shell /调用过程等,您可以组合此信息,抛弃错误,如果有任何错误被抛出则做出反应等。有关详细信息,请参阅here。
使用printStackTrace()
是一个好主意,因为你要转出发生异常的地方。这通常对于跟踪意外错误非常有用,因为它会为您提供直接(如果详细)指针,指向您遇到错误的位置。
答案 2 :(得分:4)
System.out.println(e)
相当于System.out.println(e.toString())
:System.out
是一个PrintStream,PrintStream.println(Object o)
调用PrintStream.println(o.toString())
。
e.toString()
返回类的名称,异常的getLocalizedMessage()。
e.printStackTrace()
将该信息写入System.err(非System.out),也写入堆栈跟踪,即导致异常的方法链。这是有用的信息。
我经常认为如果有一个方法返回一个包含由e.printStackTrace()
输出的信息的字符串会很好。因为没有必须使用e.getStackTrace()
并编写自己的例程来输出结果的StackTraceElements数组。
答案 3 :(得分:1)
System.out.println(e)
不会提供堆栈跟踪,只是错误消息和异常类型,以及打印到标准输出而不是错误输出。
答案 4 :(得分:1)
由于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);
}
通过这种方式,您可以在控制台中看到日志文件中的错误(如果有的话)。
答案 5 :(得分:0)
Bellow Program显示差异细节
<强>的System.out.println(E); : - 仅显示异常。 egjava.lang.ArithmeticException:/ by zero 的 e.printStackTrace(); : - 显示异常的详细信息和位置 使用行号在程序中引起异常,例如 java.lang.ArithmeticException:/ by zero at test.Test.main(Test.java:7)
包裹测试;
公共课测试{
public static void main(String args[]) {
try {
System.out.println(12 / 0);
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
}
}