Java中System.exit(-1)之前带有System.err.println()的错误消息

Java中System.exit(-1)之前带有System.err.println()的错误消息,java,system.exit,system.err,Java,System.exit,System.err,我对崩溃的Java虚拟Mashines没有错误消息有问题。我经常在代码中做一些检查。出了问题,如果其中一个检查无法完成,java程序将无法继续运行。 例如: 我是否可以确定,在使用System.exit(-1)终止JVM之前,控制台上打印了一条带有System.err.println(“…”)的错误消息?如果没有,这可以解释为什么我的JVM崩溃时没有错误消息。System.out将输出引导到标准输出流(通常映射到控制台屏幕)。System.err将输出引导到标准错误流(默认情况下,引导到控制台)

我对崩溃的Java虚拟Mashines没有错误消息有问题。我经常在代码中做一些检查。出了问题,如果其中一个检查无法完成,java程序将无法继续运行。 例如:


我是否可以确定,在使用System.exit(-1)终止JVM之前,控制台上打印了一条带有System.err.println(“…”)的错误消息?如果没有,这可以解释为什么我的JVM崩溃时没有错误消息。

System.out将输出引导到标准输出流(通常映射到控制台屏幕)。System.err将输出引导到标准错误流(默认情况下,引导到控制台)。拥有这两个函数的想法是,标准输出应用于常规程序输出,标准错误应用于错误消息。根据如何加载java程序,控制台上不会打印错误流

两个流都可以重定向到不同的目的地。如果希望将输出重定向到输出文件,并将错误消息重定向到不同的日志文件,而不是UNIX上的日志文件,则可以按如下操作:

java MyClass > output.log 2>error.log
这将导致常规输出(使用System.out)存储在output.log中,错误消息(使用System.err)存储在error.log中

另一个选项是在代码中重定向输出:

PrintStream outStream = new PrintStream(new File("outFile.txt"));
System.setOut(outStream);
System.out.println("This is a baeldung article");
在System.err的情况下:

PrintStream errStream = new PrintStream(new File("errFile.txt"));
System.setErr(errStream);
System.err.println("This is a baeldung article error");

System.out和System.err并不是检查这一点的更好解决方案,我建议添加一个类似SL4J的记录器,将其记录到适当的文件或输出中。

控制台不是JVM的一部分。因此,在某些环境中,您的消息可能不会被打印出来,但我不知道有任何这样的环境。我在NixOS(Linux)服务器上运行java程序:操作系统:NixOS 18.09.2574.a7e559a5504(水母),内核:Linux 4.14.118,体系结构:x86-64 JVM是oracle one:java版本“12.0.2”2019-07-16,java(TM)SE运行时环境(build 12.0.2+10)、Java HotSpot(TM)64位服务器虚拟机(build 12.0.2+10、混合模式、共享)Java代码由ant脚本构建,并通过以下方式运行:ant-Dstring_prompt=“$PATHPREFIX/sim_1/config.txt”“SimulationModel”>$PATHPREFIX/sim_1/commandlineOutput.txt&Java程序需要配置文件($PATHPREFIX/sim_1/config.txt)并将命令行输出转发到另一个文件(PATHPREFIX/sim_1/commandlineOutput.txt)。在bash中,您还可以使用
>output.log 2>&1
将stderr重定向到stdout,然后将stdout重定向到output.log。但我可以确保在系统退出(-1)之前刷新/打印错误消息吗点击将抑制消息刷新?是的,消息在退出系统之前刷新。
PrintStream errStream = new PrintStream(new File("errFile.txt"));
System.setErr(errStream);
System.err.println("This is a baeldung article error");