我对try,catch以及最后的Java有疑问。请考虑以下情形:
try{
//Some code here that throws IOExceotion
}
catch (IOException ex){
System.out.println("Line 1: IOException Encountered!");
throw ex;
}
finally {
System.out.println("Line 2: I am always executed!");
}
上面代码段的输出是什么? 我会看到:
Line 1: IOException Encountered!
Line 2: I am always executed!
还是
Line 2: I am always executed!
Line 1: IOException Encountered!
或者它只是(因为我们在catch块中抛出)
Line 1: IOException Encountered!
基本上,我没有找到一个示例,其中catch块中有一个“throw”,最后阻塞catch块(如上例所示)。任何人都可以对此有所了解吗?
感谢。
答案 0 :(得分:5)
引用Java Language Specification, §14.20.4:
首先执行try块,执行带有finally块的try语句。然后有一个选择:
* If execution of the try block completes normally, then the finally block is executed, and then there is a choice:
o If the finally block completes normally, then the try statement completes normally.
o If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S.
* If execution of the try block completes abruptly because of a throw of a value V, then there is a choice:
o If the run-time type of V is assignable to the parameter of any catch clause of the try statement, then the first (leftmost) such catch clause is selected. The value V is assigned to the parameter of the selected catch clause, and the Block of that catch clause is executed. Then there is a choice:
+ If the catch block completes normally, then the finally block is executed. Then there is a choice:
# If the finally block completes normally, then the try statement completes normally.
# If the finally block completes abruptly for any reason, then the try statement completes abruptly for the same reason.
+ If the catch block completes abruptly for reason R, then the finally block is executed. Then there is a choice:
# If the finally block completes normally, then the try statement completes abruptly for reason R.
# If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and reason R is discarded).
o If the run-time type of V is not assignable to the parameter of any catch clause of the try statement, then the finally block is executed. Then there is a choice:
+ If the finally block completes normally, then the try statement completes abruptly because of a throw of the value V.
+ If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and the throw of value V is discarded and forgotten).
* If execution of the try block completes abruptly for any other reason R, then the finally block is executed. Then there is a choice:
o If the finally block completes normally, then the try statement completes abruptly for reason R.
o If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and reason R is discarded).
答案 1 :(得分:3)
你会看到第一个。最后,块始终执行并作为最后一个。
答案 2 :(得分:2)
这是一个流行测验吗?开玩笑。如果有异常,您将看到第一个。 finally块语句将始终执行,因此将始终打印。