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

Java 未处理异常的输出与程序的输出混合,java,exception,exception-handling,Java,Exception,Exception Handling,当我用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; } } 但输出结果如

当我用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
等等。行或异常消息与输出随机混合。 我试着把
System.out.flush()之前
intx=1/0但它没有帮助。

当我创建自己的异常(它是扩展的RuntimeException)和NullPointerException时,也会发生这种情况。为什么会发生这种情况以及如何修复它?

之所以会发生这种情况,是因为异常是使用
System.err
打印的,它与
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;

我认为这是因为您正在处理两个不同的输出流(一个是System.err,表示异常,另一个是System.out)。正确的方法是使用记录器。此解决方案有效,但您还有其他方法可以做到吗?当我使用ArrayList时,我不能用IndexOutOfBoundsException复制这个问题,但是我可以用int[]来解决这个问题,这对我来说很奇怪。你能再解释一下这是怎么发生的吗?你还想用什么方法?我不知道你在谈论
ArrayList
int[]
,但听起来你需要问另一个问题,我真的不明白为什么输出会混淆。例如,此代码
List List=newarraylist(Arrays.asList(1,2,3));int x=list.get(3)
将抛出异常,该异常永远不会与输出的其余部分混淆,但此代码
List=Arrays.asList(1,2,3);int x=list.get(3)或此代码
int[]arr={1,2,3};int x=arr[3]将引发异常,该异常将与输出的其余部分混淆。我希望我能在没有重新分配的情况下停止混淆,因为在第一种情况下,它可以在没有我干预的情况下工作。
line0
line1
line2
line3
line4
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at Test/test.Test.main(Test.java:13)