有return的情況下try catch finally的執(zhí)行順序(最有說服力的總結)
結論:
????1哈雏、不管有沒有出現(xiàn)異常,finally塊中代碼都會執(zhí)行;
????2、當try和catch中有return時翘狱,finally仍然會執(zhí)行;
?? ?3砰苍、finally是在return后面的表達式運算后執(zhí)行的(此時并沒有返回運算后的值潦匈,而是先把要返回的值保存起來,不管finally中的代碼怎么樣师骗,返回的值都不會改變,任然是之前保存的值)讨惩,所以函數(shù)返回值是在finally執(zhí)行前確定的(集合list除外)辟癌;
????4、finally中最好不要包含return荐捻,否則程序會提前退出黍少,返回值不是try或catch中保存的返回值。
舉例:
情況1:try{} catch(){}finally{} return;
顯然程序按順序執(zhí)行处面。
進入try語句啦厂置,1
進入finally語句啦,1
testReturn的返回結果為:1
情況2:try{ return; }catch(){} finally{} return;
程序執(zhí)行try塊中return之前(包括return語句中的表達式運算)代碼魂角;再執(zhí)行finally塊昵济,最后執(zhí)行try中return;finally塊之后的語句return野揪,因為程序在try中已經(jīng)return所以不再執(zhí)行访忿。
進入try語句啦,1
進入finally語句啦斯稳,2
testReturn的返回結果為:2
情況3:try{ } catch(){return;} finally{} return;
程序先執(zhí)行try海铆,如果遇到異常執(zhí)行catch塊。有異常:則執(zhí)行catch中return之前(包括return語句中的表達式運算)代碼挣惰,再執(zhí)行finally語句中全部代碼卧斟,最后執(zhí)行catch塊中return. finally之后也就是4處的代碼不再執(zhí)行殴边。無異常:執(zhí)行完try再finally再return。
進入try語句啦珍语,1
進入catch語句啦锤岸,1
進入finally語句啦,2
testReturn的返回結果為:2
進入try語句啦廊酣,1
進入finally語句啦能耻,1
testReturn的返回結果為:2
情況4:try{ return; }catch(){} finally{return;}
程序執(zhí)行try塊中return之前(包括return語句中的表達式運算)代碼;再執(zhí)行finally塊亡驰,因為finally塊中有return所以提前退出晓猛。
進入try語句啦,1
進入finally語句啦凡辱,2
testReturn的返回結果為:3
情況5:try{} catch(){return;}finally{return;}
程序執(zhí)行catch塊中return之前(包括return語句中的表達式運算)代碼戒职;再執(zhí)行finally塊,因為finally塊中有return所以提前退出透乾。
進入try語句啦洪燥,1
進入catch語句啦,1
進入finally語句啦乳乌,2
testReturn的返回結果為:3
情況6:try{ return;}catch(){return;} finally{return;}
程序執(zhí)行try塊中return之前(包括return語句中的表達式運算)代碼捧韵。有異常:執(zhí)行catch塊中return之前(包括return語句中的表達式運算)代碼;則再執(zhí)行finally塊汉操,因為finally塊中有return所以提前退出再来。無異常:則再執(zhí)行finally塊,因為finally塊中有return所以提前退出磷瘤。
進入try語句啦芒篷,1
進入catch語句啦,1
進入finally語句啦采缚,2
testReturn的返回結果為:3
最終結論:
任何執(zhí)行try或者catch中的return語句之前针炉,都會先執(zhí)行finally語句,如果finally存在的話扳抽。如果finally中有return語句篡帕,那么程序就return了,所以finally中的return是一定會被return的贸呢,編譯器把finally中的return實現(xiàn)為一個warning赂苗。