finally,return 的執行順序
參考: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 的執行順序