gpt4 book ai didi

java - Java中的异常处理

转载 作者:行者123 更新时间:2023-12-01 06:48:03 25 4
gpt4 key购买 nike

我对Java中的try、catch和finally有疑问。考虑以下场景:

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 block 中有一个 throw)

Line 1: IOException Encountered!

基本上,我还没有找到在 catch block 中存在“throw”并且在 catch block 之后的finally block 的示例(如上面的示例)。谁能解释一下吗?

谢谢。

最佳答案

引用Java Language Specification, §14.20.4 :

带有finally block 的try语句首先执行try block 。然后有一个选择:

* 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).

关于java - Java中的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3613422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com