0

我正在通过以下代码:

public int returnSomething() {
    try {
        throw new RuntimeException("foo!");
    } finally {
        return 0;
    }
}

请解释这段代码在做什么。我的分析是我们在方法内部抛出了一个运行时异常,但是在那之后,“finally”块肯定会执行。那是对的吗?

4

3 回答 3

1

答案在Java 语言规范 14.20.2 部分。您需要注意返回算作“突然完成”:

...

  • 如果 try 块的执行由于抛出值 V 而突然完成,则有一个选择

    • [...]
    • 如果 finally 块因为任何原因突然完成,那么 try 语句也会因为同样的原因而突然完成。

(所有路径都有相同的终点,但措辞略有不同。)

所以总体结果是返回0,丢弃异常。

从一个finally街区返回很少是一个好主意。

于 2013-02-22T07:00:39.827 回答
0

快速测试表明这返回 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);
  }
}
于 2013-02-22T06:59:35.987 回答
0

finally 块的内容总是被执行。我知道它不会执行的唯一几个原因是当你拔掉插头或你的 JVM 崩溃时。所以我认为这将返回 0。

于 2013-02-22T06:56:21.750 回答