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

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

使用的输出流与@Brian指出的输出流不同,但细节级别也不相同 – 您可以尝试使用下面的简单测试。 输出:

使用println :你只知道抛出了什么exception

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 

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

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

System.out.println(e)等效于System.out.println(e.toString())System.out是一个PrintStream, PrintStream.println(Object o)调用PrintStream.println(o.toString())

e.toString()返回类的名称,以及exception的getLocalizedMessage()。

e.printStackTrace()将该信息写入System.err(而不是System.out)以及堆栈跟踪,即导致exception的方法链。 这是有用的信息。

我经常认为如果有一个方法返回一个包含e.printStackTrace()输出信息的String会很好。 因为没有必须使用e.getStackTrace()并编写自己的例程来输出生成的StackTraceElements数组。

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

自输出e.printStackTrace();System.err ,通常我将我的应用程序日志输出到文件,我建议你使用System.errSystem.out输出错误。

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

这样您就可以在控制台中看到日志文件中的错误(如果有的话)。

Bellow Program显示差异细节

的System.out.println(E); : –仅显示exception。 egjava.lang.ArithmeticException:/ by zero e.printStackTrace(); : –显示exception的详细信息以及在程序中使用行号导致exception的位置,例如java.lang.ArithmeticException:/在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(); } } 

}