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
相关产品推荐
相关产品推荐

