總結(jié):
1泊脐、不管有木有出現(xiàn)異常,finally塊中代碼都會執(zhí)行课蔬;
2囱稽、當(dāng)try和catch中有return時(shí),finally仍然會執(zhí)行二跋;
3战惊、finally是在return后面的表達(dá)式運(yùn)算后執(zhí)行的(此時(shí)并沒有返回運(yùn)算后的值,而是先把要返回的值保存起來扎即,若finally中無return吞获,則不管finally中的代碼怎么樣,返回的值都不會改變谚鄙,仍然是之前保存的值)各拷,該情況下函數(shù)返回值是在finally執(zhí)行前確定的;
4闷营、finally中最好不要包含return烤黍,否則程序不會在try塊中返回,而是從finally塊中直接退出傻盟,返回值不是try或catch中保存的返回值速蕊。
以下為轉(zhuǎn)發(fā)內(nèi)容:
原文鏈接:
try-catch-finally-return問題詳解
具體內(nèi)容如下:
(1)try里有一個(gè)return語句,那么緊跟在這個(gè)try后的finally里的代碼會不會被執(zhí)行娘赴,什么時(shí)候執(zhí)行规哲,在return前還是后;
代碼1:
執(zhí)行結(jié)果:
(2)如果finally也有return代碼 筝闹,那執(zhí)行結(jié)果是媳叨?
代碼2:
執(zhí)行結(jié)果:
注:finally里的return覆蓋掉了try里的return;
(3)如果try后面有個(gè)catch塊,里面有return語句关顷,那么finally語句會不會執(zhí)行?
代碼:
執(zhí)行結(jié)果:
在finally塊里也加上return語句:
結(jié)果:
注:如果finally里沒有return語句武福,而catch里有return語句议双,則執(zhí)行catch里的return語句;
而如果finally里也有return語句捉片,則返回finally里的return語句平痰;即catch塊不會影響finally的執(zhí)行汞舱;
finally語句塊的作用就是為了保證無論出現(xiàn)什么情況,一定要執(zhí)行的宗雇,那么finally里的代碼肯定會執(zhí)行昂芜,并且是在return前執(zhí)行;
又如:執(zhí)行結(jié)果是多少呢赔蒲;
執(zhí)行結(jié)果:
注:并不是try語句中return執(zhí)行完之后才執(zhí)行的finally泌神;
而是在執(zhí)行return b+=88時(shí),分成了兩步舞虱,先b+=88;再return b;
將return temp;放到System.out.println("finally塊");后面欢际,輸出結(jié)果不變;
如果將finally語句改為:
如果finally沒有返回語句覆蓋的話矾兜,那原來的返回值就不會變损趋,不管你是不是改變了要返回的哪個(gè)變量,所以返回的值依然不變椅寺,還是會返回111浑槽。