Java 未处理异常的输出与程序的输出混合
当我用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; } } 但输出结果如
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]如果我不将System.err重新分配给System.out,代码>将引发异常,该异常将与输出的其余部分混淆。我希望我能在没有重新分配的情况下停止混淆,因为在第一种情况下,它可以在没有我干预的情况下工作。
line0
line1
line2
line3
line4
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Test/test.Test.main(Test.java:13)