java虚拟机规范阅读(三)异常
????Java虛擬機(jī)里面的異常使用Throwable或其子類的實例來表示,拋異常的本質(zhì)實際上是程序控制權(quán)的一種即時的、非局部(Nonlocal)的轉(zhuǎn)換——從異常拋出的地方轉(zhuǎn)換至處理異常的地方。
絕大多數(shù)的異常的產(chǎn)生都是由于當(dāng)前線程執(zhí)行的某個操作所導(dǎo)致的,這種可以稱為是同步的異常。與之相對的,異步異常是指在程序的其他任意地方進(jìn)行的動作而導(dǎo)致的異常。Java虛擬機(jī)中異常的出現(xiàn)總是由下面三種原因之一導(dǎo)致的:
1.虛擬機(jī)同步檢測到程序發(fā)生了非正常的執(zhí)行情況,這時異常將會緊接著在發(fā)生非正常執(zhí)行情況的字節(jié)碼指令之后拋出。例如:
字節(jié)碼指令所蘊(yùn)含的操作違反了Java語言的語義,如訪問一個超出數(shù)組邊界范圍的元素。
類在加載或者鏈接時出現(xiàn)錯誤。
使用某些資源的時候產(chǎn)生資源限制,例如使用了太多的內(nèi)存。
2.athrow字節(jié)碼指令被執(zhí)行。
3.由于以下原因,導(dǎo)致了異步異常的出現(xiàn):
調(diào)用了Thread或者ThreadGroup的stop方法。
Java虛擬機(jī)實現(xiàn)的內(nèi)部程序錯誤。
????當(dāng)某條線程調(diào)用了stop方法時,將會影響到其他的線程,或者在線程組中的所有線程。這時候其他線程中出現(xiàn)的異常就是異步異常,因為這些異常可能出現(xiàn)在程序執(zhí)行過程的任何位置。虛擬機(jī)的內(nèi)部異常也被認(rèn)為是一種異步異常
????《Java虛擬機(jī)規(guī)范》允許在異步異常被拋出時額外執(zhí)行一小段有限的代碼,允許代碼優(yōu)化器在不違反Java語言語義的前提下檢測并把這些異常在可處理它們的地方拋出①。
????拋出異常的動作在Java虛擬機(jī)之中是一種被精確定義的程序控制權(quán)轉(zhuǎn)移過程,當(dāng)異常拋出、程序控制權(quán)發(fā)生轉(zhuǎn)移的那一刻,所有在異常拋出的位置之前的字節(jié)碼指令所產(chǎn)生的影響②都應(yīng)當(dāng)是可以被觀察到的,而在異常拋出的位置之后的字節(jié)碼指令,則應(yīng)當(dāng)是沒有被執(zhí)行過的。如果虛擬機(jī)執(zhí)行的代碼是被優(yōu)化后的代碼③,有一些在異常出現(xiàn)位置之后的代碼可能已經(jīng)被執(zhí)行了,那這些優(yōu)化過的代碼必須保證被它們提前執(zhí)行所產(chǎn)生的影響對用戶程序來說都是不可見的。
????由Java虛擬機(jī)執(zhí)行的每一個方法都會配有零至多個異常處理器(Exception Handlers),異常處理器描述了其在方法代碼中的有效作用范圍(通過字節(jié)碼偏移量范圍來描述)、能處理的異常類型以及處理異常的代碼所在的位置。要判斷某個異常處理器是否可以處理某個具體的異常,需要同時檢查異常出現(xiàn)的位置是否在異常處理的有效作用范圍內(nèi)并且出現(xiàn)的異常是否異常處理器聲明可以處理的異常類型或其子類型兩個條件。當(dāng)有異常被拋出時,Java虛擬機(jī)搜索當(dāng)前方法的包含的各個異常處理器,如果能找到可以處理該異常的異常處理器,則將代碼控制權(quán)轉(zhuǎn)向到異常處理器中描述的處理異常的分支之中。
????搜索異常處理器時的搜索順序是很關(guān)鍵的,在Class文件里面,每個方法的異常處理器都存儲在一個表中。在運(yùn)行時,當(dāng)有異常出現(xiàn)之后,Java虛擬機(jī)就按照Class文件中的異常處理器表描述異常處理器的先后順序,從前至后進(jìn)行搜索。
????需要注意,Java虛擬機(jī)本身不會對方法的對異常處理器表做排序或者其他方式的強(qiáng)制處理,所以Java語言中對異常處理的語義,實際上是通過編譯器適當(dāng)安排異常處理器在表中的順序來協(xié)助完成的。在Class文件中定義了明確的異常處理器查找順序,才能保證無論Class文件是通過何種途徑產(chǎn)生的,Java虛擬機(jī)執(zhí)行時都能有一致的行為表現(xiàn)。
轉(zhuǎn)載于:https://blog.51cto.com/zangyanan/1855720
總結(jié)
以上是生活随笔為你收集整理的java虚拟机规范阅读(三)异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: genymotion 此应用与您的手机不
- 下一篇: 关于ASP.NET 中的主题