e.printStackTrace和System.out.println(e)之间的区别

时间:2012-08-23 15:41:41

标签: java exception exception-handling

可能是一个新手问题,但每个人似乎都使用e.printStackTrace(),但在异常处理时我总是使用System.out.println(e)。有什么区别,为什么e.printStackTrace()更受欢迎?

6 个答案:

答案 0 :(得分:37)

使用的输出流与@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");
}

答案 1 :(得分:7)

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

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

e.g。

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

会将错误写入一个日志,并将结果写入另一个日志。根据您的shell /调用过程等,您可以组合此信息,抛弃错误,如果有任何错误被抛出则做出反应等。有关详细信息,请参阅here

使用printStackTrace()是一个好主意,因为你要转出发生异常的地方。这通常对于跟踪意外错误非常有用,因为它会为您提供直接(如果详细)指针,指向您遇到错误的位置。

答案 2 :(得分:4)

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数组。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

  

Bellow Program显示差异细节

     

<强>的System.out.println(E); : - 仅显示异常。   egjava.lang.ArithmeticException:/ by zero     的 e.printStackTrace(); : - 显示异常的详细信息和位置   使用行号在程序中引起异常,例如   java.lang.ArithmeticException:/ by zero at   test.Test.main(Test.java:7)

包裹测试;

公共课测试{

public static void main(String args[]) {
    try {
        System.out.println(12 / 0);

    } catch (Exception e) {
        System.out.println(e);
        e.printStackTrace();
    }

}

}