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;
}
}
}
为什么返回值为4?
答案 0 :(得分:14)
这就是finally
的工作方式。摘录
try {
throw new Exception();
} catch(Exception e) {
throw new Exception();
}
将突然完成 ,但finally子句将启动,当它返回时丢弃完成声明的原始原因。
Java语言规范中的Blocks and Statements部分对此进行了解释。我已经在你的情况中突出了相关的路径:
带有{的
try
语句 执行finally
块 首先执行try
阻止。然后有 选择:
- 如果 执行
try
块正常完成,然后是finally
块是 执行,然后有一个选择:
- ...
- 如果执行
try
块的。{ 由于a而突然完成 价值throw
V ,然后有一个选择:
- 如果 运行时类型 V 是 可分配给任何参数
catch
条款try
声明,然后是 第一个(最左边)这样 选择了catch
子句。 值 V 被分配给 所选参数catch
条款和 阻止 执行catch
子句。 然后有一个选择:
- 如果
catch
块完成 通常,那么finally
块是 执行。然后有一个选择:
- ...
- 如果是
catch
块完成 突然之所以 R ,那么finally
块是 执行。然后有一个选择:
- 如果
finally
块完成 通常,然后是try
声明突然完成 原因 R 。- 如果
finally
阻止突然完成的原因 S ,然后try
声明突然完成 原因 S (原因 R 被丢弃了。)- 如果 V 的运行时类型 不能分配给参数 任何
catch
条款try
声明,然后是finally
块是 执行。然后有一个选择:
- ...
- 如果执行了
try
块完成 突然出于任何其他原因 R ,然后是finally
块是 执行。然后有一个选择:
- ...
答案 1 :(得分:2)
你永远不应该从finally块返回。这是非常糟糕的做法。请参阅Java try-finally return design question和Does finally always execute in Java?。
答案 2 :(得分:1)
StakOverflow上有几个问题可以解释这一点。
为简单起见:如果在finally子句中放入return或throw语句,则这是方法的最后一个操作。一般来说,这是一种不好的做法。
答案 3 :(得分:1)
最后将始终返回4. finally块将始终执行,无论try和catch块中是否存在任何异常。
答案 4 :(得分:0)
finally块返回一个值的事实导致吞下抛出的异常,因此它不会传播出该方法。