You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java System.out未正确报告输出错误问题咨询

问题原因分析

当你执行java Test >&-时,shell会在启动Java进程前关闭标准输出(文件描述符1)和标准错误(文件描述符2)。但JVM在初始化阶段会自动修复不可用的标准流:它会将System.out(以及System.err)重定向到系统的null设备(比如macOS上的/dev/null),而非让流处于无效状态。

这就导致:

  • System.out.println("Testing")的写入操作实际上是输出到null设备,不会触发任何IO错误
  • System.out.checkError()会刷新缓冲区并检查错误标志,但由于写入操作没有失败,错误标志保持为false
  • 程序不会执行System.exit(1),最终退出码为0,符合你看到的结果
验证与解决方法

如果你想让程序检测到标准输出被关闭的情况,可以绕过PrintStream的自动错误处理,直接使用底层的FileOutputStream进行写入,它会直接抛出IOException:

class Test {
  public static void main(String[] args) {
    try {
        // 直接使用FileOutputStream写入标准输出,不经过PrintStream的缓冲和错误掩盖
        FileOutputStream stdout = new FileOutputStream(FileDescriptor.out);
        stdout.write("Testing\n".getBytes());
        stdout.flush();
    } catch (IOException e) {
        // 捕获到写入失败,退出码设为1
        System.exit(1);
    }
  }
}

执行这个修改后的程序,java Test >&-会得到退出码1,符合你的预期。

内容的提问来源于stack exchange,提问作者user129393192

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:35:34