在java中,如果try和catch都抛出相同的异常并最终返回怎么办?

时间:2011-02-26 10:49:05

标签: 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;
        }
    }
}

为什么返回值为4?

5 个答案:

答案 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 questionDoes finally always execute in Java?

答案 2 :(得分:1)

StakOverflow上有几个问题可以解释这一点。

为简单起见:如果在finally子句中放入return或throw语句,则这是方法的最后一个操作。一般来说,这是一种不好的做法。

答案 3 :(得分:1)

最后将始终返回4. finally块将始终执行,无论try和catch块中是否存在任何异常。

答案 4 :(得分:0)

finally块返回一个值的事实导致吞下抛出的异常,因此它不会传播出该方法。