Cha*_*nth 4 java exception-handling
public class Abc {
public static void main(String args[]) {
System.out.println(Abc.method());
}
static int method() {
try {
throw new Exception();
}
catch(Exception e) {
throw new Exception();
}
finally {
return 4;
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么返回值为4?
aio*_*obe 14
这是有效的方式finally.片段
try {
throw new Exception();
} catch(Exception e) {
throw new Exception();
}
Run Code Online (Sandbox Code Playgroud)
将突然完成,但finally子句将启动,当它返回时,它会丢弃完成声明的原始原因.
这在Java语言规范中的块和语句一节中进行了解释.我已经强调了你情况中的相关路径:
通过首先执行块来执行
try具有finally块 的语句try.然后有一个选择:
- 如果
try块的执行正常完成,则finally执行块,然后有一个选择:
- ...
- 如果
try块的执行由于throw值 V而突然完成 ,则可以选择:
- 如果V的运行时类型可分配给语句的任何
catch子句 的参数try,则选择第一个(最左边)这样的catch子句.将值V分配给selectedcatch子句的参数 ,并执行该 子句的 Blockcatch.然后有一个选择:
- 如果
catch块正常完成,则finally执行块.然后有一个选择:
- ...
- 如果
catch块因为原因R突然完成,则finally执行该 块.然后有一个选择:
- 如果
finally块正常完成,则该try语句突然完成的原因[R .- 如果
finally块因原因S而突然完成 ,则try语句突然完成,原因为S(并且原因R 被丢弃).- 如果V的运行时类型 不能分配给
catch该try语句的任何子句 的参数,则finally执行该 块.然后有一个选择:
- ...
- 如果
try由于任何其他原因R突然完成finally块的执行,则执行该 块.然后有一个选择:
- ...