先看一段代码
Exception e = new Exception("i is exception");
e.printStackTrace();
System.out.println("end");
以上代码多执行几次,会出现如下情况

System.out打印的内容在e.printStackTrace()之前输出!太不可思议了。
查看e.printStackTrace()源代码发现,它将内容输出到System.err
Throwable.java
public void printStackTrace() {
printStackTrace(System.err);
}
原来,在操作系统中,存在三种标准输入/输出,分别是标准输入流、标准输出流、错误流,错误流是一种特殊的输出,一般将错误信息写入到错误流中。java中的System.out对应标准输出流,System.err对应错误流,因为是两种流,所以各自输出时机有差异,无法保证顺序。从而出现如上所示情景。
其实如果细心观察,这两种输出颜色不一样,控制台已经给做了区分。
修复
理解了以上原理,那么如何修复这个问题呢?其实也简单,让他们都输出到同一流中就行了。e.printStackTrace()有个重载方法printStackTrace(PrintStream s)
Exception e = new Exception("i is exception");
e.printStackTrace(System.out); //fix 顺序不确定
System.out.println("end");
再执行以下,发现颜色都一致了。

本文深入探讨了Java中异常输出顺序不确定的问题,解释了System.out和e.printStackTrace()输出顺序受制于标准输出流和错误流的特性。通过调整输出流,可以解决顺序问题,确保输出的一致性和可预测性。
790

被折叠的 条评论
为什么被折叠?



