![](/img/trans.png)
[英]What is the difference between e.printStackTrace(System.out) and e.printStackTrace()?
[英]Difference between e.printStackTrace and System.out.println(e)
可能是新手问题,但似乎每个人都使用e.printStackTrace()
,但我在异常处理时一直使用System.out.println(e)
。 有什么区别,为什么e.printStackTrace()
更可取?
使用的输出流与@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");
}
如果您使用System.out.println
,那么您将错误转储到stdout
,而不是stderr
。
将错误转储到标准错误是传统的做法,因此您可以从错误输出中过滤出正常的成功输出。 这是命令行实用程序的常见做法,因此是一个好主意。
例如
myCommand 2> /tmp/errors > /tmp/results
将错误写入一个日志,并将结果写入另一个。 根据您的外壳/调用过程等,您可以组合此信息、丢弃错误、在抛出任何错误时做出反应等。有关更多信息,请参见此处。
使用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();
的输出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.println(e)
不会为您提供堆栈跟踪,只会提供错误消息和异常类型,以及打印到标准输出而不是错误输出。
波纹管程序显示差异细节
System.out.println(e); :-只显示异常。 egjava.lang.ArithmeticException: / by zero 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();
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.