JVM的異常處理
異常處理的兩大組成要素:拋出異常和捕獲異常。這兩大要素共同實現程序控制流的非正常轉移。
拋出異常分為:顯式和隱式兩種。
顯式拋異常的主題是應用程序,它指的是在程序中使用 “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的異常處理