先看一段代码
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");
再执行以下,发现颜色都一致了。
参考
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/20255.html