我有以下代码段: -
public class MyProgram {
public static void throwit(){
throw new RuntimeException();
}
public static void main(String args[]){
try {
System.out.println("Hello world ");
throwit();
System.out.println("Done with try block ");
}
finally {
System.out.println("Finally executing ");
}
}
}
据我所知, 一旦程序抛出未捕获的RuntimeException(在throwit()方法中),将执行finally块并终止程序。如果方法不处理异常,则在传播异常之前执行finally块。
但是,我得到的输出每次都有不同的顺序 我得到的ouptuts:
输出1: -
Hello world Finally executing Exception in thread "main" java.lang.RuntimeException at tutorialspoint.A.throwit(A.java:6) at tutorialspoint.A.main(A.java:13)
输出2: -
Hello world Exception in thread "main" java.lang.RuntimeException at tutorialspoint.A.throwit(A.java:6) at tutorialspoint.A.main(A.java:13) Finally executing
答案 0 :(得分:3)
您的理解是正确的。首先执行finally块,然后传播异常。
第二个输出可能是因为程序的输出被写入System.out
并且execption的详细信息被写入System.err
。由于两个流都被重定向到同一个窗口,因此它们的打印顺序可能会在不同的执行中发生变化。
如果您将System.setErr(System.out);
行添加到main
方法的开头,则所有输出(包括错误)都会写入System.out
,您将始终看到按照OUTPUT 1中的顺序排列。
答案 1 :(得分:0)
输出可能是由于System.out
中的竞赛条件输出到标准控制台而System.err
输出到错误控制台。