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

Amm*_*mmu 67 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

结果是返回Val:10.

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

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

Boz*_*zho 73

它被一个覆盖finally,因为它finally是在其他一切之后执行的.

这就是为什么,一个经验法则 - 永远不会回来finally.例如,Eclipse显示了该片段的警告:"finally块无法正常完成"


Vla*_*nov 51

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

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

  • 说最后总是执行是一件非常危险的事情.你真的不能依赖它执行任务关键操作.考虑像停电,jvm腐败/崩溃等等.我知道这听起来有点挑剔,但总是一个强有力的词,我想我们有时会忘记我们生活在现实世界中那样的灾难发生. (13认同)

maf*_*afu 18

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

  1. 返回值由catch代码置于堆栈中.
  2. 然后,执行finally代码并覆盖堆栈上的值.
  3. 然后,该方法返回最新的值(10)以供调用者使用.

如果不确定这样的事情,请回到您对底层系统的理解(最终进入汇编程序级别).

(有趣的旁注)


小智 5

在此处输入图片说明

finally 块总是被执行,除非 System.exit() 语句是 finally 块中的第一个语句。

所以在上面的例子中 Exection 被 try 语句抛出并在 catch 块中捕获。有一个值为5 的return 语句,因此在堆栈调用中,值5稍后在执行 finally 块时添加,最新的返回值在返回值时添加到堆栈顶部,堆栈根据堆栈行为“LAST IN FIRST OUT”返回最新值,所以它将返回值为10。