我正在通过以下代码:
public int returnSomething() {
try {
throw new RuntimeException("foo!");
} finally {
return 0;
}
}
请解释这段代码在做什么。我的分析是我们在方法内部抛出了一个运行时异常,但是在那之后,“finally”块肯定会执行。那是对的吗?
我正在通过以下代码:
public int returnSomething() {
try {
throw new RuntimeException("foo!");
} finally {
return 0;
}
}
请解释这段代码在做什么。我的分析是我们在方法内部抛出了一个运行时异常,但是在那之后,“finally”块肯定会执行。那是对的吗?
答案在Java 语言规范 14.20.2 部分。您需要注意返回算作“突然完成”:
...
如果 try 块的执行由于抛出值 V 而突然完成,则有一个选择
- [...]
- 如果 finally 块因为任何原因突然完成,那么 try 语句也会因为同样的原因而突然完成。
(所有路径都有相同的终点,但措辞略有不同。)
所以总体结果是返回0,丢弃异常。
从一个finally
街区返回很少是一个好主意。
快速测试表明这返回 0,而不是传播 RuntimeException。
public class Test {
public static int returnSomething() {
try {
throw new RuntimeException("foo!");
} finally {
return 0;
}
}
public static void main(String[] args) {
int i=returnSomething();
System.out.println(i);
}
}
finally 块的内容总是被执行。我知道它不会执行的唯一几个原因是当你拔掉插头或你的 JVM 崩溃时。所以我认为这将返回 0。