java 标准输出流 错误流 System.out System.err 标准输出与错误输出顺序不确定

先看一段代码

 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");

再执行以下,发现颜色都一致了。
在这里插入图片描述

参考

Why does the execution order between the printStackTrace() and the other methods appear to be nondeterministic?

发布了336 篇原创文章 · 获赞 369 · 访问量 193万+

猜你喜欢

转载自blog.csdn.net/wangjun5159/article/details/103725939