異常處理是JAVA的一大特色,當虛擬機執行代碼出現異常的時候,會拋出相應的異常信息。理解虛擬機異常機制能夠讓我們可以更好的處理異常,不至於導致系統停止運行並可以呈現出友好的異常提示,還可以自己編寫異常類來處理相應的錯誤。
1.異常分類
由上圖所示,異常的基類為Throwable,Error、Exception為其子類。其中,Error經常用來用於表示系統錯誤或低層資源的錯誤,不是JAVA層面上能夠處理的,為不可捕捉異常。Exception中可以分為兩類,第一類為RunTimeException,這種異常可以捕捉也可以不捕捉,是運行時異常,例如數組越界、空指針異常;另一類為必須捕捉的異常,例如IOException、SQLException等異常。
2.異常的拋出和捕獲
學習異常不外乎就是理解其異常是如何拋出的,還有是如何進行捕獲的,這其中包含了5個關鍵字:throws、throw、try、catch、finally.具體請看如下例程:
1 package test; 2 3 public class TestException { 4 5 public static void main(String[] args) { 6 TestException te = new TestException(); 7 try { 8 te.method1(); 9 } catch (Exception e) { 10 e.printStackTrace(); 11 }finally { 12 System.out.println("run finally code."); 13 } 14 } 15 16 public void method1() throws Exception { 17 this.method2(); 18 19 } 20 public void method2() throws Exception { 21 this.method3(); 22 23 } 24 public void method3() throws Exception{ 25 throw new Exception("Exception in method3"); 26 27 } 28 }
其運行的流程圖為:
首先,Method3函數使用關鍵字throw在方法體內拋出異常,然后在方法上throws Exception,這樣就是提示給調用該方法的代碼一個提示:運行這個方法會拋出異常,需要進行處理(可以繼續拋出或者進行捕獲處理);然后Method2方法內部調用Method3方法,不捕獲異常,則再次拋出異常,Method1方法內部調用Method2方法,依然不捕獲異常,又在方法名后方throws Exception,最終方法Main方法對Method1方法進行捕獲異常,使用try關鍵字包含會產生異常的代碼,隨后catch相應的異常做相應的處理,最終使用finally關鍵字執行后續代碼,無論是否捕捉到異常,fianlly中的代碼都會執行。
這段代碼執行后控制台打印如下信息:
java.lang.Exception: Exception in method3
at test.TestException.method3(TestException.java:23)
at test.TestException.method2(TestException.java:19)
at test.TestException.method1(TestException.java:15)
at test.TestException.main(TestException.java:8)
這段代碼模擬了一般出現異常的普遍現象,此方法將此 Throwable 對象的堆棧跟蹤輸出至錯誤輸出流,作為字段 System.err 的值。輸出的第一行包含此對象的 toString() 方法的結果。剩余行表示以前由方法 fillInStackTrace() 記錄的數據。