在Java中當try、finally語句中包含return語句時,執行情況到底是怎樣的,finally中的代碼是否執行,大家眾說紛紜,有的說會執行,有的說不會執行,到底哪種說法正確,現在通過下面的例子加以說明:
第一種情況:try中包含return語句,finally中不包含
public class TestTry { static String s=""; public static void main(String args[]){ s = test1(); System.out.println("8 "+s); } public static String test1(){ try { System.out.println("try....."); return s = "a"; } finally{ s="b"; System.out.println("17 "+s); } } }這裡我們定義了一個字符串s,在try裡面將"a"賦值給s,並直接返回,在finally裡面把"b"賦值給s,最終s的值是a還是b呢?下面是執行的結果
try..... 17 b 8 a
我們發現最後的結果是a,但是b優先於a打印出來了,這是為什麼呢?通過debug單步調試我們發現,在執行try中的return之前會先執行finally中的代碼,之後再執行return語句。如果finally中也包含return語句,會出現什麼情況呢,我們看第二種情況。
第二種情況:try,finally中都包含return語句我們將上面的代碼稍作改動
public class TestTry { static String s=""; public static void main(String args[]){ s = test1(); System.out.println("8 "+s); } public static String test1(){ try { System.out.println("try....."); return s = "a"; } finally{ return s="b"; } } }將finally中的s="b";直接改成return s="b";,會出現什麼樣的結果呢?字符串s是a還是b呢?
try..... 8 b
我們發現最後的打印結果是b。
我們知道return語句用在某一個方法中,一是用於返回函數的執行結果,二是用於返回值為void類型的函數中,僅僅是一個return語句(return ;),此時用於結束方法的執行,也即此return後的語句將不會被執行,當然,這種情況下return語句後不能再有其它的語句了。
public static int print() { int c = 1; try { c++; System.out.println("try執行中..."); return c+100; //--------1 } catch (Exception e) { e.printStackTrace(); //return c; //--------4 } finally { c++; System.out.println("finally執行中..."); return c ; //--------2 } //return c; //---------3 }程序執行的結果為:
run:
try執行中...
finally執行中...
3
成功構建(總時間: 0 秒)
注意,2與3位置處的return語句只能有一個,並且2、3、4中必須有一個return語句,如果2出執行後方法就結束了,3處的語句得不到執行。
try語句塊執行到1處時,會將會將函數的返回值存放到另外一個臨時變量(不同與c的變量,它的值為102)中,由於未發生異常,緊接著將會執行finally語句塊,2處又遇到一個語句塊,並將返回值存放到臨時變量(值為3)中,最終返回的是此處的臨時變量的值,此處return執行完成後,該方法結束。
public static int print() { int c = 1; try { c++; System.out.println(c); System.out.println("try"); return c+100; //------- -1 }finally { c++; System.out.println(c); System.out.println("finally"); } }上述代碼中finally語句塊中沒有return語句,函數最終返回的是第一個臨時變量的值,也即102,執行結果如下:
run:tryfinally102成功構建(總時間: 0 秒)
結論:1.無論try裡面有沒有return語句,finally語句一定都會執行(不愧是finally,名字起的好)。
2.如果finally中沒有return語句,try裡面有return,那麼在執行try中的return語句之前會先去執行finally中的代碼,再去執行try中的return語句;如果在finally中也包含return語句,將會直接返回,不再去執行try中的return語句。