try catch finally的底層原理
來源:https://blog.csdn.net/lwd512768098/article/details/114728720
finally終究執(zhí)行
????public?static?int?test()?{?
????????int?i?=?1;
????????try?{?
????????????i++;
????????}?finally?{?
????????????System.out.println("finally?yeah!");
????????}
????????return?i;
????}
????public?static?void?main(String[]?args)?{?
????????System.out.println(test());
????}
輸出為

????public?static?int?test()?{?
????????int?i?=?1;
????????try?{?
????????????i++;
????????????throw?new?Exception();
????????}?catch?(Exception?e)?{?
????????????System.out.println("Exception?yeah!");
????????}?finally?{?
????????????System.out.println("finally?yeah!");
????????}
????????return?i;
????}
????public?static?void?main(String[]?args)?{?
????????System.out.println(test());
????}

帶有return的情況
finally不帶return的情況
對(duì)于return情況的話,只要記住一句話就行,如果finally里面有return, 那么就會(huì)覆蓋try塊或者catch里面的return內(nèi)容,否則的話,在執(zhí)行finally的內(nèi)容之前(try塊或者catch里面有return語句),會(huì)計(jì)算好try或者catch里面的return表達(dá)式的值,然后保存到另一個(gè)局部變量,當(dāng)執(zhí)行fianlly的時(shí)候,會(huì)重新加載這個(gè)局部變量作為返回值,因此在finally的操作不會(huì)影響返回值,下面我們字節(jié)碼來看看內(nèi)部的工作原理。
????public?static?int?test()?{?
????????int?i?=?1;
????????try?{?
????????????i++;
????????????return?i;
????????}?finally?{?
????????????i++;
????????????System.out.println("finally?yeah!");
????????}
????}
????public?static?void?main(String[]?args)?{?
????????System.out.println(test());
????}
第二個(gè)問題:最終結(jié)果是多少?


finally帶有return
????public?static?int?test()?{?
????????int?i?=?1;
????????try?{?
????????????i++;
????????????return?i;
????????}?finally?{?
????????????i++;
????????????System.out.println("finally?yeah!");
????????????return?i;
????????}
????}
????public?static?void?main(String[]?args)?{?
????????System.out.println(test());
????}

沒錯(cuò),返回了3,說明finally對(duì)i的修過是其效果的,我們從字節(jié)碼看看原因:

try, catch, finally均沒有return語句
????public?static?int?test()?{?
????????int?i?=?1;
????????try?{?
????????????i++;
????????}?finally?{?
????????????i++;
????????????System.out.println("finally?yeah!");
????????}
????????return?i;
????}
????public?static?void?main(String[]?args)?{?
????????System.out.println(test());
????}

總結(jié)
PS:如果覺得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、轉(zhuǎn)發(fā)、在看。
PS:如果覺得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、轉(zhuǎn)發(fā)、在看。
評(píng)論
圖片
表情
