日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

catch后面的代码会执行吗_字节码层面理解try、catch、finally

發(fā)布時間:2025/3/20 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 catch后面的代码会执行吗_字节码层面理解try、catch、finally 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

面試中經(jīng)常有關(guān)于try、catch、finally相關(guān)的問題,今天從字節(jié)碼層面了解他們的運行流程。

簡單代碼

直接上測試簡單代碼,如下圖:

這里是一個簡單的測試代碼,代碼中有三個異常和一個finally,這里用一個int數(shù)組來替代對象,面試中經(jīng)常會問最終會返回數(shù)組(對象)的值是多少?

在這里我們通過jclasslib查看編譯后的字節(jié)碼,并找到方法的字節(jié)碼指令,如下圖:

右邊被圈中的就是test()方法執(zhí)行的字節(jié)碼指令,字節(jié)碼指令較長,接下來一部分一部分的分析。

字節(jié)碼指令分析

前面30行之前的指令對應(yīng)的是try-catch中間的代碼,把fileInputStream與serverSocket初始化出來放到方法的變量表中。

接著30行之后的指令如下圖:

aload_1加載本地變量表中第1項變量(this是第0項,ids是第1項),接著iconst_0、iconst_1分別表示加載int型0、1,iastore表示把第數(shù)組第0項設(shè)置值為1,最后astore表示把數(shù)組存入本地變量表,也就是在執(zhí)行"ids[0] =1"這一步代碼。

我們看接下來37至40行指令與上一步比較相似,翻譯過來是在執(zhí)行"ids[0]=5",41行至49行在執(zhí)行"System.out.println("finally code");"這樣代碼,51行才執(zhí)行了return;

從上一段分析可以看出,直到finally中的代碼執(zhí)行完成后才執(zhí)行了return指令。這樣我們就能回答面試的那個問題了,因為在finally中修改了數(shù)組的值!

異常處理

先看看這個方法的異常表,如下圖:

異常表中除了我們代碼中指明的三個異常外,編譯器還自動生成了5個Any類型的異常,用于處理其他不可預(yù)期的異常處理。圈中的三列分別表示異常監(jiān)控的指令開始、結(jié)束行以及處理行,也就是在對應(yīng)的指令行出現(xiàn)異常他們就能處理。

可以看到我們指明的異常監(jiān)控的是try-catch中的指令,而編譯器生成的則是監(jiān)控異常處理中的指令。

繼續(xù)看字節(jié)碼指令,如下圖:

根據(jù)異常表我已經(jīng)圈出了第一個異常處理的指令,從52行開始,astore_2表示將索引存儲到本地變量表中第2項,實際上就是將"FileNotFoundException e"產(chǎn)生的變量e存入,53至56行指令則是將數(shù)字2存入數(shù)組中,對應(yīng)代碼"ids[0]=2;",說明在執(zhí)行第一個catch中的代碼。

后面的指令可以很明顯的看出來又是在執(zhí)行finally中的代碼,后面的幾個異常基本相似,都是執(zhí)行自己的catch中的代碼后再次執(zhí)行finally中代碼,這里就不再一一分析了!

總結(jié)

根據(jù)以上分析可以看出,finally不管是程序正常執(zhí)行還是有異常,在字節(jié)碼層面都會把finally中的代碼編譯在正常和異常代碼后面,所以有多少個catch,finally代碼就會多編譯多少次,并且return指令都是在finally中的代碼執(zhí)行完成后才執(zhí)行!

Java程序員日常學習筆記,如理解有誤歡迎各位交流討論!

總結(jié)

以上是生活随笔為你收集整理的catch后面的代码会执行吗_字节码层面理解try、catch、finally的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。