catch中的return语句的行为,最后

时间:2011-04-18 10:50:33

标签: java try-catch-finally

请参阅以下代码并解释输出行为。

public class MyFinalTest {

    public int doMethod(){
        try{
            throw new Exception();
        }
        catch(Exception ex){
            return 5;
        }
        finally{
            return 10;
        }
    }

    public static void main(String[] args) {

        MyFinalTest testEx = new MyFinalTest();
        int rVal = testEx.doMethod();
        System.out.println("The return Val : "+rVal);
    }

}

结果是返回Val:10。

Eclipse显示警告:finally block does not complete normally

catch块中的return语句会发生什么?

8 个答案:

答案 0 :(得分:72)

它被finally中的那个覆盖,因为finally在其他所有内容后执行。

这就是为什么,经验法则永远不会从finally 返回。例如,Eclipse显示了该代码段的警告:“finally块无法正常完成”

答案 1 :(得分:50)

始终执行

finally(唯一的例外是System.exit())。你可以这样想到这种行为:

  1. 抛出异常
  2. 捕获异常并将返回值设置为5
  3. 最后执行块并将返回值设置为10
  4. 该函数返回

答案 2 :(得分:18)

如果您记住VM的低级布局,这是一个简单的问题。

  1. 返回值由catch代码置于堆栈中。
  2. 然后,执行finally代码并覆盖堆栈上的值。
  3. 然后,该方法返回最新的值(10)以供调用者使用。
  4. 如果不确定这样的事情,请回到你对底层系统的理解(最终进入汇编级别)。

    funny sidenote

答案 3 :(得分:3)

始终执行finally块(如果执行了匹配的尝试),所以在方法返回5之前​​,如catch块中一样,它执行finally块并返回10。

答案 4 :(得分:3)

enter image description here

最后,块始终执行,除非并且直到System.exit()语句在finally块中为第一个。

因此在上面的示例中,exe语句由try语句抛出并在catch块中获取catch。返回语句的值为 5 ,因此在堆栈调用值 5 中稍后会在最后执行的块上添加,并且最新的返回值将在堆栈顶部添加,同时返回值,堆栈按照堆栈行为返回最新值“LAST IN FIRST OUT”所以它将返回值 10。

答案 5 :(得分:0)

finally部分将执行始终执行。例如如果你有任何事情要发布,或者注销某种东西,如果发生错误,那么去catch部分,否则最终会执行。

Session session //  opened some session 
try 
{
 // some error 
}
catch { log.error }
finally 
{ session.logout();}

它不应该用于返回任何东西。你可以在外面使用。

答案 6 :(得分:0)

简而言之,无论返回是在 try 还是 catch 块中出现,我们都可以说最终阻止了返回语句

总是最终在该用例中占主导地位。

public static int m1() {
    try {
        return 100;
    } 
    catch(Exception e)
    {
        return 101;
    }
    finally {
        return 102;
    }
}

输出-102

答案 7 :(得分:0)

finally块将始终执行(唯一的例外是它在它之前的任何地方都遇到System.exit()),因此简单地将5替换(覆盖)为10,再由finally块返回