1. 程式人生 > >finally,return 的執行順序

finally,return 的執行順序

方法 返回值 存在 pub 無法 style 語句 tail art

參考:http://blog.csdn.net/qj19842011/article/details/45675057

關於finally,return的執行順序
例子:
try{
return expression;
}finally{
do some work;
}
1、執行:expression,計算該表達式,結果保存在操作數棧頂;
2、執行:操作數棧頂值(expression的結果)復制到局部變量區作為返回值;
3、執行:finally語句塊中的代碼;
4、執行:將第2步復制到局部變量區的返回值又復制回操作數棧頂;
5、執行:return指令,返回操作數棧頂的值;
我們可以看到,在第一步執行完畢後,整個方法的返回值就已經確定了,由於還要執行finally代碼塊,
因此程序會將返回值暫存在局部變量區,騰出操作數棧用來執行finally語句塊中代碼,等finally執行完畢,
再將暫存的返回值又復制回操作數棧頂。所以無論finally語句塊中執行了什麽操作,都無法影響返回值,
所以試圖在finally語句塊中修改返回值是徒勞的。
因此,finally語句塊設計出來的目的只是為了讓方法執行一些重要的收尾工作,而不是用來計算返回值的。

例子驗證:

  

public class Test1 {    
    public int exp() {
        try {
            System.out.println("5");
            throw new ArithmeticException();
        } catch (ArithmeticException e) {
            System.out.println("6");
            return 2;
        }finally {
            System.out.println(
"8"); } } public static void main(String[] args) { System.out.println(new Test1().exp()); } }


執行結果:
5 //先執行了try
6      //執行了catch
8 //執行了finally
2 //最後再執行catch裏面的return語句。

註意:try,catch,finally代碼塊裏都可能出現return語句,執行情況又是怎麽樣的呢?

首先,我們要清楚一點:不管在哪個代碼塊裏出現了return,return這個返回動作都是都是要等到finally代碼塊執行完之後再執行。

所以:1.如果finally代碼塊裏有return語句,那麽執行finally裏的return,返回結果,不再執行其他代碼。

   2.如果finally代碼塊裏沒有return語句,try代碼塊裏有return語句,那麽執行try裏面的return返回結果,不再執行其他代碼。

   3.如果finally,try代碼塊裏面都沒有return語句那麽就執行catch裏的return語句.

   4.如果函數不用返回值,那麽執行完finally代碼塊後正常結束。

finally,return 的執行順序