33

大概是个新手问题,不过好像大家都用过,但是我在异常处理的时候e.printStackTrace()一直用。System.out.println(e)有什么区别,为什么更e.printStackTrace()可取?

4

7 回答 7

48

使用的输出流与@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");
}
于 2012-08-23T15:45:18.953 回答
7

如果您使用System.out.println,那么您将错误转储到stdout,而不是stderr.

将错误转储为标准错误是传统的做法,因此您可以从错误输出中过滤正常的成功输出。这是命令行实用程序的常见做法,因此是一个好主意。

例如

myCommand 2> /tmp/errors > /tmp/results

会将错误写入一个日志,并将结果写入另一个日志。根据您的 shell/调用过程等,您可以组合此信息、丢弃错误、如果抛出任何错误等做出反应等。有关更多信息,请参见此处

使用printStackTrace()是一个好主意,因为您正在倾倒发生异常的位置。这对于跟踪意外错误通常是无价的,因为它会为您提供一个直接(如果详细)指针,指向您遇到错误的确切位置。

于 2012-08-23T15:42:39.687 回答
6

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 的结果数组。

于 2012-08-23T15:51:01.513 回答
2

由于e.printStackTrace();is的输出System.err并且通常我将我的应用程序日志输出到文件中,因此我建议您同时使用System.errSystem.out输出错误。

public static void log(Exception e) {
    e.printStackTrace(); // This goes to System.err
    e.printStackTrace(System.out);
}

通过这种方式,您可以在日志文件(如果有的话)和控制台中看到错误。

于 2018-01-16T12:56:19.577 回答
1

System.out.println(e)不会给你你的堆栈跟踪,只是错误消息和异常类型,以及打印到标准输出而不是错误输出。

于 2012-08-23T15:47:32.117 回答
0

波纹管程序显示差异细节

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();
        }

    }
}
于 2017-07-25T07:31:49.947 回答
0

System.out.println(e)你只需要知道抛出了什么异常,但你会得到关于e.printStackTrace()抛出什么异常以及导致它的原因的信息。

于 2021-09-04T13:31:12.160 回答