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

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

先看一段代码

 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?

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值