未处理的异常的输出与程序的输出混淆

Output of the untreated exception mixing up with output of the program

当我运行这个程序在java

package test;

public class Main {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println("line"+i);
        }
        System.out.flush();
        int x=1/0;
    }
}

我期待这样的输出:

line0
line1
line2
line3
line4
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at test.Main.main(Main.java:8)

Process finished with exit code 1

但输出如下所示:

Exception in thread "main" java.lang.ArithmeticException: / by zero
line0
    at test.Main.main(Main.java:8)
line1
line2
line3
line4

Process finished with exit code 1

在我 运行 之后:

line0
Exception in thread "main" java.lang.ArithmeticException: / by zero
line1
    at test.Main.main(Main.java:9)
line2
line3
line4

Process finished with exit code 1

等等。行或异常消息与输出 运行domly 混淆。 我尝试将 System.out.flush(); 放在 int x=1/0; 之前,但它没有帮助。 这也发生在我创建自己的异常(它扩展了 RuntimeException)和创建 NullPointerException 时。为什么会发生这种情况,我该如何解决?

发生这种情况是因为异常是使用 System.err 打印的,PrintStream 不同于 System.out。如果你想使用 System.out 打印异常,那么你可以调用 System#setErr:

System.setErr(System.out);

for (int i = 0; i < 5; i++) {
    System.out.println("line"+i);
}

int x = 1 / 0;

输出:

line0
line1
line2
line3
line4
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Test/test.Test.main(Test.java:13)