java中關於try、catch、finally的總結
轉自:https://www.cnblogs.com/hyzxx/p/5151911.html
參考:
https://www.cnblogs.com/superFish2016/p/6687549.html
https://blog.csdn.net/wangqingbo0829/article/details/52458283
面試的時候只要涉及到筆試,幾乎一定會涉及到的問題。有return的情況下try、catch、finally的問題
結論
1、不管有沒有異常,finally中的程式碼都會執行
2、當try、catch中有return時,finally中的程式碼依然會繼續執行
3、finally是在return後面的表示式運算之後執行的,此時並沒有返回運算之後的值,而是把值儲存起來,不管finally對該值做任何的改變,返回的值都不會改變,依然返回儲存起來的值。也就是說方法的返回值是在finally運算之前就確定了的。
4、finally程式碼中最好不要包含return,程式會提前退出,也就是說返回的值不是try或catch中的值
舉例:
情況1:try{}catch{}finally{} return;
程式正常進行
情況2:try{return;}catch{}finally{} return;
a、先執行try中的語句,包括return後面的表示式,b、然後執行finally中的語句,c、最後執行try中的return
ps:返回值是try中的return後面的表示式的值,finally後面的return語句不會被執行
情況3:try{} catch{return;} finally{} return;
先執行try中的程式碼塊
有異常:a、先執行catch中的語句,包括return後面的表示式,b、然後執行finally中的語句,c、最後執行catch中的return,finally後面的return不會被執行
無異常:執行finally中的程式碼塊,然後執行return語句
情況4:try{return;} catch{} finally{return;}
a、先執行try中的語句,包括return後面的表示式,b、然後執行finally中的語句,c、最後執行finally中的return
ps:返回的值是finally中return後面的表示式的值,因為finally中有return語句,所以會提前退出
情況5:try{} catch{return} finally{return};
先執行try中的程式碼塊
有異常:a、先執行catch中的語句,包括return後面的表示式,b、然後執行finally中的語句,c、最後執行finally中的return,因為finally中有return語句,所以會提前退出
無異常:執行finally中的程式碼塊,然後執行finally中的return
情況6:try{return;} catch{return;} finally{return;}
先執行try中的程式碼塊,包括return後面的表示式
有異常:a、先執行catch中的語句,包括return後面的表示式,b、然後執行finally中的語句,c、最後執行finally中的return,因為finally中有return語句,所以會提前退出
無異常:執行finally中的程式碼塊,然後執行finally中的return
最總結論:在執行try、catch中的return之前一定會執行finally中的程式碼(如果finally存在),如果finally中有return語句,就會直接執行finally中的return方法,所以finally中的return語句一定會被執行的。編譯器把finally中的return語句標識為一個warning.
最後的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
列印的結果是:
分析結果:
1、先執行try中return後面的表示式,然後執行finally的語句
2、返回值是try中return後面的表示式計算出來的值,即使finally中對chang進行了修改,也不會修改最後的返回值。try中先把計算出來的值放到不同於chang的區域性變數中,執行完finally後在取出結果。應該是儲存在函式棧中的。
參考文章地址:http://blog.csdn.net/kavensu/article/details/8067850