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.err
和System.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(); } }
}
- 在Java中拯救吞噬的exception
- 为什么我得到NoClassDefFoundError:java / awt / Desktop?
- javax.naming.NoInitialContextException – Java
- Java中的exception和inheritance
- java.sql.SQLException:参数索引超出范围(2>参数个数,为0)
- 获取exceptionorg.apache.logging.slf4j.SLF4JLoggerContext无法强制转换为org.apache.logging.log4j.core.LoggerContext
- EOFException – 如何处理?
- Java数组索引以某种方式超出界限?
- 在编写字符串时,如何调试导致转换错误的xml对象?