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