try catch finally執行順序

2021-10-21 14:00:16 字數 1761 閱讀 8870

異常處理中,try、catch、finally的執行順序,大家都知道是按順序執行的。即,如果try中沒有異常,則順序為try→finally,如果try中有異常,則順序為try→catch→finally。但是當try、catch、finally中加入return之後,就會有幾種不同的情況出現,下面分別來說明一下。也可以跳到最後直接看總結。

一、try中帶有return

private int testreturn1()  catch (exception e)  finally 

return i;

}

輸出:

try:2

finally:3

2

因為當try中帶有return時,會先執行return前的**,然後暫時儲存需要return的資訊,再執行finally中的**,最後再通過return返回之前儲存的資訊。所以,這裡方法返回的值是try中計算後的2,而非finally中計算後的3。但有一點需要注意,再看另外乙個例子:

private listtestreturn2()  catch (exception e)  finally 

return list;

}

輸出:

try:[1]

finally:[1, 3]

[1, 3]

看完這個例子,可能會發現問題,剛提到return時會臨時儲存需要返回的資訊,不受finally中的影響,為什麼這裡會有變化?其實問題出在引數型別上,上乙個例子用的是基本型別,這裡用的引用型別。list裡存的不是變數本身,而是變數的位址,所以當finally通過位址改變了變數,還是會影響方法返回值的。

二、catch中帶有return

private int testreturn3()  catch (exception e)  finally 

return i;

}

輸出:

try:2

catch:3

finally:4

3

catch中return與try中一樣,會先執行return前的**,然後暫時儲存需要return的資訊,再執行finally中的**,最後再通過return返回之前儲存的資訊。所以,這裡方法返回的值是try、catch中累積計算後的3,而非finally中計算後的4。

三、finally中帶有return

private int testreturn4()  catch (exception e)  finally 

}

輸出:

try:2

finally:3

3

當finally中有return的時候,try中的return會失效,在執行完finally的return之後,就不會再執行try中的return。這種寫法,編譯是可以編譯通過的,但是編譯器會給予警告,所以不推薦在finally中寫return,這會破壞程式的完整性,而且一旦finally裡出現異常,會導致catch中的異常被覆蓋。

總結:1、finally中的**總會被執行。

2、當try、catch中有return時,也會執行finally。return的時候,要注意返回值的型別,是否受到finally中**的影響。

3、finally中有return時,會直接在finally中退出,導致try、catch中的return失效。

try catch finally執行順序

public class test public static int ma catch exception e finally 說明 不出現異常情況 執行順序 try finally 出現異常情況 執行順序 try catch finally try中有返回語句,沒有異常 執行順序 try ret...

try catch finally執行順序

結論 1 不管有木有出現異常,finally塊中 都會執行 2 當try和catch中有return時,finally任會執行 3 finally是在return表示式運算後前執行的,所以函式返回值是在finally執行前確定的 4 finally中最好不要包含return,否則程式會提前退出,返回...

try catch finally使用體會

try catch finally public class finallytest static int test finally 結果是2。在try語句中,在執行return語句時,要返回的結果已經準備好了,就在此時,程式轉到finally執行了。在轉去之前,try中先把要返回的結果存放到不同於...