<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          try catch finally的底層原理

          共 3819字,需瀏覽 8分鐘

           ·

          2021-11-23 21:18

          相關(guān)閱讀

          300本計算機編程的經(jīng)典書籍下載

          AI全套:Python3+TensorFlow打造人臉識別智能小程序

          最新人工智能資料-Google工程師親授 Tensorflow-入門到進階

          Java架構(gòu)全階段七期完整

          黑馬頭條項目 - Java Springboot2.0(視頻、資料、代碼和講義)14天完整版

          Spring核心編程思想


          來源:https://blog.csdn.net/lwd512768098/article/details/114728720

          昨晚參加一個面試,被問到try catch finally相關(guān)的知識,雖然之前了解過其中奇怪的用法,特別有return的情況,但是由于時間久遠,完全忘了,導(dǎo)致這個問題回答不是很好,只是知道finally無論是否發(fā)生異常都會執(zhí)行的(但是忘了含有return的情況是怎么處理的了),finally常常用來關(guān)閉一些資源,像文件,連接等。

          finally終究執(zhí)行

          我們先來驗證一下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());
          ????}


          從上面兩個例子中我們可以看到,無論是正確運行try塊還是在try塊發(fā)生了異常,finally塊都是被執(zhí)行的搜索公眾號互聯(lián)網(wǎng)架構(gòu)回復(fù)“2T”,送你一份驚喜禮包。

          帶有return的情況

          finally不帶return的情況

          對于return情況的話,只要記住一句話就行,如果finally里面有return, 那么就會覆蓋try塊或者catch里面的return內(nèi)容,否則的話,在執(zhí)行finally的內(nèi)容之前(try塊或者catch里面有return語句),會計算好try或者catch里面的return表達式的值,然后保存到另一個局部變量,當(dāng)執(zhí)行fianlly的時候,會重新加載這個局部變量作為返回值,因此在finally的操作不會影響返回值,下面我們字節(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());
          ????}

          第一個問題:在try塊中含有return語句,你覺得finally語句還有執(zhí)行么?
          第二個問題:最終結(jié)果是多少?

          從上面可以看到,盡管try塊里面有return, 但是finally塊仍然執(zhí)行了,你肯定會好奇,那為啥返回值是2呢,finally里面不是還進行了i++么。搜索公眾號互聯(lián)網(wǎng)架構(gòu)師回復(fù)“2T”,送你一份驚喜禮包。
          簡單分析一下,從結(jié)果看,finally仍然執(zhí)行,說明try的return語句是還沒執(zhí)行的,下面我們看看字節(jié)碼。
          上面圖片已經(jīng)標(biāo)注很清楚了,如果還不明白的話,可以先去看一下這幾個字節(jié)碼命令,還是挺簡單的,注意的是,JVM操作都是基于操作數(shù)棧的。

          總結(jié)一下,總體的意思就是,當(dāng)執(zhí)行完try塊的時候,會計算return表達式的值,然后把這個返回值存在另一個臨時變量里面,最后返回的時候會重新讀取存放的變量,因此在finally后面無論如何修改,都不會影響返回值(除非finally里面含有return,這個我們在下面討論)

          finally帶有return

          上面的情況是try或者catch里面含有return,finally沒有return, 那么fianlly里面如何修改返回值是不會影響最后的返回值。下面討論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());
          ????}

          相信各位能夠正常猜出結(jié)果了

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

          從上圖可以看到,在返回之前,加載的是0槽位的變量,這時0槽位的變量的值是3,1槽位的變量是2,所以返回的3。
          由上可以得知,當(dāng)finally中含有return的時候,會覆蓋之前try或者catch(上面沒有貼出實驗,需要驗證的可以去驗證,作者本人是驗證過了)里面的返回值的搜索公眾號互聯(lián)網(wǎng)架構(gòu)回復(fù)“2T”,送你一份驚喜禮包。

          try, catch, finally均沒有return語句

          這種情況比較簡單,跟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é)

          這里總結(jié)一下,只要finally里面沒有return語句,那么返回值就由try或者catch的return語句決定,否則由finally的return語句決定
          全棧架構(gòu)社區(qū)交流群

          ?「全棧架構(gòu)社區(qū)」建立了讀者架構(gòu)師交流群,大家可以添加小編微信進行加群。歡迎有想法、樂于分享的朋友們一起交流學(xué)習(xí)。

          掃描添加好友邀你進架構(gòu)師群,加我時注明姓名+公司+職位】

          看完本文有收獲?請轉(zhuǎn)發(fā)分享給更多人


          往期資源:


          Flutter 移動應(yīng)用開發(fā)實戰(zhàn) 視頻(開發(fā)你自己的抖音APP)
          Java面試進階訓(xùn)練營 第2季(分布式篇)
          Java高級 - 分布式系統(tǒng)開發(fā)技術(shù)視頻
          瀏覽 32
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲七区| 91精品国产91热久久久做人人 | 国产精品五月天婷婷视频 | 国产国产日韩欧美V∧ | av噢美|