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.so
System.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);
}