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?

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/20255.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论