System.err有什么意义?

Gav*_* Z. 21 java unix bash stderr

在UNIX中,我应该编写一个Java文件,将"EXIT 1"打印到标准错误,然后以状态1退出.

这是我的方法..

System.err.println("EXIT 1");
System.exit(1);
Run Code Online (Sandbox Code Playgroud)

这是我应该做的吗?

如果是这样,我怎么能在Unix shell中使用它?当我在bash中编译并运行它时,它只打印"EXIT 1"(所以它与System.out.println做同样的事情,我为什么要使用"err"?).这里的"标准错误"是什么?

Mul*_*er0 30

每个正在运行的程序都有这三个流:

  • 标准输入(stdin),通常来自键盘.暴露为System.in
  • 标准输出(标准输出),通常进入控制台.暴露为 System.out
  • 标准错误(stderr),通常也会进入控制台.暴露为System.err

你的程序是正确的 - 它打印到stderr.但在正常情况下,stderr流就像stdout流一样进入控制台,因此它们在视觉上无法区分.

但是,您应该使用stderr而不是stdout来处理错误消息的原因是重定向.这意味着您将stderr发送到文件而不是控制台.同时,stdout将不受影响,因为这两个流是独立的.

例如,您可以在bash,cmd,PowerShell等中执行此操作:

$ java Program 2> errors.txt
Run Code Online (Sandbox Code Playgroud)

现在,所有输出System.err.println()都将结束errors.txt,同时System.out.println()仍然会进入屏幕.这有助于调试.

  • 更重要的是,`java Program> normal-output.txt`将运行程序,并将正常输出发送到文件(供以后处理),但仍然会向屏幕发送错误. (3认同)