大概是个新手问题,不过好像大家都用过,但是我在异常处理的时候e.printStackTrace()
一直用。System.out.println(e)
有什么区别,为什么更e.printStackTrace()
可取?
7 回答
使用的输出流与@Brian 指出的不同,但详细程度也不相同 - 您可以尝试下面的简单测试。输出:
With println
: 你只知道抛出了什么异常
java.lang.UnsupportedOperationException:尚未实现
With 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");
}
如果您使用System.out.println
,那么您将错误转储到stdout
,而不是stderr
.
将错误转储为标准错误是传统的做法,因此您可以从错误输出中过滤正常的成功输出。这是命令行实用程序的常见做法,因此是一个好主意。
例如
myCommand 2> /tmp/errors > /tmp/results
会将错误写入一个日志,并将结果写入另一个日志。根据您的 shell/调用过程等,您可以组合此信息、丢弃错误、如果抛出任何错误等做出反应等。有关更多信息,请参见此处。
使用printStackTrace()
是一个好主意,因为您正在倾倒发生异常的位置。这对于跟踪意外错误通常是无价的,因为它会为您提供一个直接(如果详细)指针,指向您遇到错误的确切位置。
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 的结果数组。
由于e.printStackTrace();
is的输出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.println(e)
不会给你你的堆栈跟踪,只是错误消息和异常类型,以及打印到标准输出而不是错误输出。
波纹管程序显示差异细节
System.out.println(e); :- 只显示异常。egjava.lang.ArithmeticException: / 为零 e.printStackTrace(); :- 显示异常的详细信息以及在程序中导致异常的位置,例如 java.lang.ArithmeticException: / 在 test.Test.main(Test.java:7) 处为零
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()
抛出什么异常以及导致它的原因的信息。