1. 程式人生 > >JVM的異常處理

JVM的異常處理

多個 cat 編譯器 索引 index catch 需要 exception 負數

異常處理的兩大組成要素:拋出異常和捕獲異常。這兩大要素共同實現程序控制流的非正常轉移。

拋出異常分為:顯式和隱式兩種。

顯式拋異常的主題是應用程序,它指的是在程序中使用 “throw” 關鍵字。手動將異常實例拋出。

隱式拋異常的主題是java虛擬機,它指的是java虛擬機在執行過程中,碰到無法繼續執行的異常狀態,自動過拋出異常。舉例來說,java虛擬機在執行讀取數組操作時,發現輸入的索引值是負數,故而拋出數組索引越界異常(ArrayIndexOutOfBoundsException)。

捕獲異常則涉及了如下三種代碼塊:

1、try代碼塊:用來標記需要進行異常監控的代碼。

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

3、finally代碼塊:跟在try代碼塊和catch代碼塊之後,用來聲明一段必定運行的代碼。它的設計初衷是為了避免跳過某些關鍵的清理代碼。例如關閉已打開的系統資源。

在程序正常執行的情況下,這段代碼會在try代碼塊執行之後執行。否則,也就是在try代碼塊拋異常的情況下,如果該異常沒有被捕獲,finally代碼塊會直接運行,並且在運行之後重新拋出異常。

如果該異常被catch代碼塊捕獲,finally代碼塊則在catch代碼塊之後運行。在某些不幸的情況下,catch代碼塊也觸發了異常,那麽finally代碼塊同樣會執行,並會拋出catch代碼塊觸發的異常。在某極端不幸的情況下,finally代碼塊也觸發了異常,那麽只好中斷當前finally代碼塊的執行,並往外拋出異常。

JVM的異常處理