故意抛出运行时异常

时间:2013-02-22 06:51:26

标签: java exception-handling

我正在阅读以下代码:

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

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

3 个答案:

答案 0 :(得分:1)

答案在Java Language Specification section 14.20.2。你需要知道返回计为“突然完成”:

  

...

     
      
  • 如果由于抛出值V而导致try块的执行突然完成,则可以选择

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

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

因此总体结果是返回0并且异常被丢弃。

finally区块返回是一个不错的主意。

答案 1 :(得分:0)

始终执行finally块的内容。我知道它不会执行的唯一几个原因是你拉动插头或你的JVM崩溃。所以我认为这将返回0。

答案 2 :(得分: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);
  }
}