Java e.printStackTrace和System.out.println(e)之间的差异
可能是个新手问题,但每个人似乎都使用Java e.printStackTrace和System.out.println(e)之间的差异,java,exception,exception-handling,Java,Exception,Exception Handling,可能是个新手问题,但每个人似乎都使用e.printStackTrace(),但我在处理异常时总是使用System.out.println(e)。区别是什么?为什么e.printStackTrace()更可取?如果使用System.out.println,则将错误转储到stdout,而不是stderr 传统的做法是将错误转储到标准错误,因此可以从错误输出中筛选正常的成功输出。这是命令行实用程序的常见做法,因此是一个好主意 e、 g 将错误写入一个日志,并将结果写入另一个日志。取决于您的shell/
e.printStackTrace()
,但我在处理异常时总是使用System.out.println(e)
。区别是什么?为什么e.printStackTrace()
更可取?如果使用System.out.println
,则将错误转储到stdout
,而不是stderr
传统的做法是将错误转储到标准错误,因此可以从错误输出中筛选正常的成功输出。这是命令行实用程序的常见做法,因此是一个好主意
e、 g
将错误写入一个日志,并将结果写入另一个日志。取决于您的shell/调用过程等。您可以组合此信息、丢弃错误、在抛出任何错误时作出反应等。有关更多信息,请参阅
使用
printStackTrace()
是一个好主意,因为您正在转储发生异常的位置。这对于跟踪意外错误通常是非常宝贵的,因为它将为您提供一个直接(如果详细)的指针,指向您遇到错误的确切位置。使用的输出流与@Brian指出的不同,但详细程度也不相同-您可以尝试下面的简单测试。输出:
使用println
:您只知道抛出了什么异常
java.lang.UnsupportedOperationException:尚未实现
使用printStackTrace
:您还知道是什么导致了它(行号+调用堆栈)
java.lang.UnsupportedOperationException:尚未实现在javaapplication27.Test1.test(Test1.java:27)
位于javaapplication27.Test1.main(Test1.java:19)
System.out.println(e)
不会给您堆栈跟踪,只会给您错误消息和异常类型,也不会打印到标准输出,而不是错误输出。System.out.println(e)
相当于System.out.println(e.toString())
:System.out
是一个打印流,PrintStream.println(对象o)
调用PrintStream.println(o.toString())
e.toString()
返回类的名称和异常的getLocalizedMessage()
e.printStackTrace()
将该信息写入System.err(而不是System.out)和堆栈跟踪,即导致异常的方法链。这是有用的信息
我经常想,如果有一个方法返回一个字符串,其中包含e.printStackTrace()
输出的信息,那就太好了。因为没有,所以您必须使用e.getStackTrace()
并编写自己的例程来输出生成的StackTraceElements数组
下面的程序显示差异详细信息
System.out.println(e);:-仅显示异常。
e、 g.java.lang.arithmetricException:/by零
e.printStackTrace();:-显示异常的详细信息和位置
在程序中引起行号异常,例如。
java.lang.arithmetricException:/在
test.test.main(test.java:7)
由于
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);
}
通过这种方式,您可以在日志文件(如果您有)和控制台中看到错误。@imulsion在Unix中--可能在Wondows中也有,我不知道--您可以像下面这样分别重定向标准输出和错误消息yourProgram>~/filethattcontainssstandardOutput.txt 2>~/filethattainsserrors.txt在什么和什么之间?标准和标准?我试着在Eclipse中演示上面的内容,控制台中的stdout显示为黑色,而stderr显示为红色。更一般地说,它们只是两个输出流,您可以随意处理。尝试它们,您将看到它们的区别。您还可以读取printStackTrace()的代码。有一个返回对象数组的
e.getStackTrace()
。此外,printStackTrace接受PrintStream
或PrintWriter
参数,因此您可以向其传递StringWriter对象或任何其他拖缆以提取数据。OutputStream.println令人困惑,因为OutputStream没有任何方法。它仅在PrintStream.soSystem.err.println(e)中定义代码>=e.getStackTrace()
?@rootTraveler<代码>系统错误打印项次(e)
有一个空返回,并将异常的toString()
打印到stderr。该输出中没有堆栈跟踪e.getStackTrace()
返回StackTraceeElement
的数组。这些都在JavaDoc中,您可以自己轻松地尝试。
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");
}
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();
}
}
}
public static void log(Exception e) {
e.printStackTrace(); // This goes to System.err
e.printStackTrace(System.out);
}