摘要:當(dāng)觸發(fā)異常的字節(jié)碼的索引值在某個異常表條目的監(jiān)控范圍內(nèi),虛擬機會判斷所拋出的異常和該條目想要捕獲的異常是否匹配。
作者:李瑞杰讓我們準(zhǔn)備一個函數(shù):
然后,反編譯他的字節(jié)碼:
首先我們介紹異常表:在編譯生成的字節(jié)碼中,每個方法都附帶一個異常表。
異常表中的每一個條目代表一個異常處理器,并且由 from 指針、to 指針、target 指針以及所捕獲的異常類型構(gòu)成。這些指針的值是字節(jié)碼索引用以定位字節(jié)碼。
下圖就是我特別指出的JVM字節(jié)碼中的異常表部分。
我們來分析一下這幾個語句的執(zhí)行流程,首先執(zhí)行:
這相當(dāng)于執(zhí)行:
再來:
上圖相當(dāng)于執(zhí)行
有人問:try去哪了?
我馬上就要介紹。此時idiv執(zhí)行完就有異常了,有異常了先找異常表。
我再貼一下異常表,他是怎么搜索的呢?
當(dāng)程序觸發(fā)異常時,Java 虛擬機會從上至下遍歷異常表中的所有條目。
當(dāng)觸發(fā)異常的字節(jié)碼的索引值在某個異常表條目的監(jiān)控范圍內(nèi),Java 虛擬機會判斷所拋出的異常和該條目想要捕獲的異常是否匹配。
如果匹配,Java 虛擬機會將控制流轉(zhuǎn)移至該條目 target 指針指向的字節(jié)碼。
我們看 ,是第四個索引指向的字節(jié)碼出了問題,顯然,此時應(yīng)該匹配紅線這一條記錄,從而跳轉(zhuǎn)到第14個索引的字節(jié)碼。
我們看他怎么做的?
new出一個RuntimeException并拋出,它就是
這一句,按照我們剛才的流程,此時依然需要找到這個RuntimeException在哪個異常表的條目中
此時匹配到異常表的條目,跳轉(zhuǎn)到字節(jié)碼索引23
繼續(xù)拋出RuntimeExcpetion,可以注意到 這實際上對應(yīng)了
這個語句,于是我們可以知道,在三個都出現(xiàn)異常的情況下,實際上最終向外拋出的異常是finally里面的異常。
可以看到當(dāng)31索引處調(diào)用athrow語句拋出異常時,此時異常表沒有任何一個條目能夠匹配該異常,此時怎么辦呢?
如果遍歷完所有異常表條目,Java 虛擬機仍未匹配到異常處理器,那么它會彈出當(dāng)前方法對應(yīng)的 Java 棧幀,并且在調(diào)用者中重復(fù)上述操作。
在最壞情況下,Java 虛擬機需要遍歷當(dāng)前線程 Java 棧上所有方法的異常表。
事實上分析以上的整體的全部語句你可以發(fā)現(xiàn),jvm層面有真正的finally嗎?
沒有
現(xiàn)在的做法是,復(fù)制 finally 代碼塊的內(nèi)容,分別放在 try-catch 代碼塊所有正常執(zhí)行路徑以及異常執(zhí)行路徑的出口中。無論是否出現(xiàn)異常,確保一定會執(zhí)行finally語句。
剛才catch出了異常,依然執(zhí)行finally語句就可以發(fā)現(xiàn)這一點。至于其他路徑,大家可以自行驗證。我就在這里拋磚引玉了。
至于為什么2-6發(fā)生任何異常都跳轉(zhuǎn)到23?大家可以自己想一下這個問題。
我就提示一點 2-6 target為14的條目代表的catch是不能捕獲所有異常的,但是你要確保finally的語句能夠執(zhí)行。而2-6恰巧是try語句塊的內(nèi)容。23這個索引恰巧是finally語句的一份復(fù)制。
END
個人公眾號:石杉的架構(gòu)筆記(ID:shishan100)
歡迎長按下圖關(guān)注公眾號:石杉的架構(gòu)筆記!
公眾號后臺回復(fù)資料,獲取作者獨家秘制學(xué)習(xí)資料
石杉的架構(gòu)筆記,BAT架構(gòu)經(jīng)驗傾囊相授
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/7148.html
摘要:當(dāng)觸發(fā)異常的字節(jié)碼的索引值在某個異常表條目的監(jiān)控范圍內(nèi),虛擬機會判斷所拋出的異常和該條目想要捕獲的異常是否匹配。 作者:李瑞杰目前就職于阿里巴巴,狂熱JVM愛好者讓我們準(zhǔn)備一個函數(shù):showImg(https://user-gold-cdn.xitu.io/2019/5/19/16acbce35adfefb7);然后,反編譯他的字節(jié)碼:showImg(https://user-gold-cd...
摘要:當(dāng)觸發(fā)異常的字節(jié)碼的索引值在某個異常表條目的監(jiān)控范圍內(nèi),虛擬機會判斷所拋出的異常和該條目想要捕獲的異常是否匹配。 作者:李瑞杰目前就職于阿里巴巴,狂熱JVM愛好者讓我們準(zhǔn)備一個函數(shù):showImg(https://user-gold-cdn.xitu.io/2019/5/19/16acbce35adfefb7);然后,反編譯他的字節(jié)碼:showImg(https://user-gold-cd...
摘要:源碼解讀系列二啟動階段都干了些啥閱讀框架源碼了解啟動階段的那些事兒小伙伴剛接觸的時候會感覺壓力有點大更直觀的說法是難開發(fā)組是不贊成難這個說法的的代碼都是實現(xiàn)的而又是世界上最好的語言的代碼閱讀起來是很輕松的之后開發(fā)組會用系列源碼解讀文章深 date: 2018-8-01 14:22:17title: swoft| 源碼解讀系列二: 啟動階段, swoft 都干了些啥?descriptio...
摘要:阿里云是國內(nèi)云服務(wù)器市場的龍頭,性價比高,速度快又安全,是站長建站首選的云服務(wù)器之一。作為一個老司機,福利吧也和大家分享一下我的阿里云推廣經(jīng)驗,教大家如何免費推廣云大使。阿里云是國內(nèi)云服務(wù)器市場的龍頭,性價比高,速度快又安全,是站長建站首選的云服務(wù)器之一。福利吧使用的也是阿里云服務(wù)器,是折騰了很多次網(wǎng)站搬家后,才選擇了阿里云。身邊好幾個站長最后都殊途同歸,用了阿里云,可見阿里云服務(wù)器性能確實...
閱讀 730·2023-04-25 19:43
閱讀 3974·2021-11-30 14:52
閱讀 3801·2021-11-30 14:52
閱讀 3865·2021-11-29 11:00
閱讀 3796·2021-11-29 11:00
閱讀 3894·2021-11-29 11:00
閱讀 3571·2021-11-29 11:00
閱讀 6154·2021-11-29 11:00