您好我已经写了下面的代码。每次执行后,它以不同的顺序显示输出。
public class ExcetionInFinallyBlockDemo1 {
public static void main(String[] args) {
int a[] = new int[5];
try {
System.out.println("Accessing sixth element" + a[5]);
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
} finally {
System.out.println("finally block start");
try {
double divide = a[3] / 0;
System.out.println("Divide result:" + divide);
} catch (ArithmeticException e2) {
e2.printStackTrace();
}
System.out.println("Finall block end");
}
System.out.println("rest of the code");
}
}
首先运行输出:
java.lang.ArrayIndexOutOfBoundsException: 5
at com.sanju.exceptionHandling.ExcetionInFinallyBlockDemo1.main(ExcetionInFinallyBlockDemo1.java:11)
java.lang.ArithmeticException: / by zero
finally block start
at com.sanju.exceptionHandling.ExcetionInFinallyBlockDemo1.main(ExcetionInFinallyBlockDemo1.java:17)
Finall block end
rest of the code
第二次运行输出:
java.lang.ArrayIndexOutOfBoundsException: 5
at com.sanju.exceptionHandling.ExcetionInFinallyBlockDemo1.main(ExcetionInFinallyBlockDemo1.java:11)
finally block start
Finall block end
rest of the code
java.lang.ArithmeticException: / by zero
at com.sanju.exceptionHandling.ExcetionInFinallyBlockDemo1.main(ExcetionInFinallyBlockDemo1.java:17)
第三轮输出:
java.lang.ArrayIndexOutOfBoundsException: 5
at com.sanju.exceptionHandling.ExcetionInFinallyBlockDemo1.main(ExcetionInFinallyBlockDemo1.java:11)
java.lang.ArithmeticException: / by zero
at com.sanju.exceptionHandling.ExcetionInFinallyBlockDemo1.main(ExcetionInFinallyBlockDemo1.java:17)
finally block start
Finall block end
rest of the code
您能解释为什么每次都以不同的顺序打印吗?
答案 0 :(得分:3)
这是因为两个输出流System.out和System.err是独立缓冲的。
虽然我还没有完全理解为什么 - 我的第一个答案 - 冲洗缓冲区 - 实际上没有帮助(正如bowmore建议的那样)并且如果不使用自己的同步解决方案似乎是不可能的。
一个简单的解决方法是只使用一个缓冲区用于err和out:
System.setErr(System.out);