1. 程式人生 > >深入拆解虛擬機器(六)JVM是如何處理異常的?

深入拆解虛擬機器(六)JVM是如何處理異常的?

丟擲異常

(1)顯式拋異常的主體是應用程式,它指的是程式中使用’'throw "關鍵字,手動將異常例項丟擲

(2)隱式拋異常的主體是Java虛擬機器,它指的是Java虛擬機器在執行過程中,碰到無法繼續執行的異常狀態,自動丟擲異常


捕獲異常

(1)try程式碼塊:用來標記需要進行異常監控的程式碼

(2)catch程式碼塊:跟在try程式碼塊之後,用來捕獲在try程式碼塊中觸發的某種指定型別的異常。除了宣告所捕獲異常的型別之外,catch程式碼塊還定義了針對該異常型別的異常處理器。在java中,try程式碼塊後面可以跟著多個catch程式碼塊,來捕獲不同型別的異常。JAVA虛擬機器會從上至下匹配異常處理器。因此,前面的catch程式碼塊所捕獲的異常不能覆蓋後面的,否則編譯器會報錯

(3)finally程式碼塊:跟在try程式碼塊和catch程式碼塊之後,用來宣告一段必定執行的程式碼。它的設計初衷是為了避免跳過某些關鍵的清理程式碼,例如關閉已開啟的系統資源

(4)try程式碼塊觸發異常的情況下,如果該異常沒有被捕獲,finally程式碼會直接執行,並且在執行之後重新丟擲該異常

(5)在某些不幸的情況下,catch程式碼塊也觸發了異常,那麼finally程式碼塊會執行,並會丟擲catch程式碼塊觸發的異常。在某些極端不幸的情況下,finally程式碼塊也觸發了異常,那麼只好中斷當前finally程式碼塊的執行,並往外拋異常


異常基本概念

(1)在Java語言規範中,所有異常都是Throwable類或者其子類的例項。Throwable有兩大直接子類。第一個是Error,涵蓋程式不應捕獲的異常。當程式觸發Error,它的執行狀態已經無法恢復,需要中止執行緒甚至是終止虛擬機器。第二類則是Exception,涵蓋程式可能需要捕獲並且處理的異常

(2)Exception又分為RuntimeException和其他型別。RuntimeException和Error屬於非檢查異常。其他Exception屬於檢查異常,在觸發時需要顯式捕獲,或者在方法頭用throws關鍵字宣告


Java虛擬機器是如何捕獲異常的?

(1)Java位元組碼中,每個方法對應一個異常表。當程式觸發異常時,Java虛擬機器將查詢異常表,並依此決定需要將控制流轉移到哪個異常處理器之中。Java程式碼中的catch程式碼塊和finally程式碼塊都會生成異常表條目