異常(Exception)
一、什么是異常?
異常就是程序中的錯誤,比如數組越界、訪問空指針等。在java中,一切皆對象,異常也不例外。所有的異常都是派生于Throwable類的一個實例對象。
二、異常的分類
在異常界,有兩大流派。一派叫Error類,另一派叫Exception類,它們都繼承自Throwable類。在Exception類下還有兩大分支,IOException類和RuntimeException類。
RuntimeException是由程序本身的錯誤導致的異常。
IOException是程序本身沒有問題,但是因為IO發生的錯誤引起的異常。
舉例:
RuntimeException(unchecked) | IOException(checked) |
數組訪問越界 | 試圖打開一個不存在的文件 |
訪問空指針 | 試圖在文件尾部讀取數據 |
錯誤的類型轉換 |
|
RuntimeException類和它的叔叔Error類比較親,叔侄倆統稱為未檢查異常(unchecked Exception),大白話就是不用你檢查,不用你管的異常。而IOException和它的兄弟和叔叔明顯不是一路的,被稱為已檢查異常(checked Exception),就是你得管它。
三、異常處理(Exception handing)
前面說過未檢查異常不用我們管,所以這里就只說我們怎么對付已檢查異常。
(1)throws
首先,你得聲明它。方法應該在其首部用throws+異常名聲明所有可能拋出的異常。
拋出異常的4中情形:
1.調用一個拋出已檢查異常的方法。
2.程序運行過程中發現錯誤,并且利用throws語句拋出已檢查異常
3.程序出現錯誤,比如數組訪問越界,會自動拋出ArrayIndexOutOfBoundsException
4.Java虛擬機和運行時庫出現的內部錯誤
舉個例子:
1 Class MyAnimation{2 public Image LoadImage(String s)throws IOException, EOFException3 {4 ......5 }6 }
(2)用throw關鍵字拋出異常
1 String readData(Scanner in)throws EOFException{ 2 ... 3 while(...){ 4 if(!in.hasNext()) 5 { 6 if(n<len) 7 throw new EOFException(); 8 } 9 }10 }
(3)自定義異常
當java提供的異常滿足不了需要的時候,可以自己DIY一個
1 //定義一個FileFormatException類 2 class FileFormatException extends IOException{ 3 public FileFormatException(){} 4 public FileFormatException(String gripe){ 5 super(gripe); 6 } 7 } 8 //下面拋出自定義異常 9 String readData(Scanner in)throws EOFException10 {11 ...12 while(...){13 if(ch == -1){14 if(n<len)15 throw new FileFormatException();16 }17 }18 return s;19 }
(4)捕獲異常
光把異常拋出去,不能不管啊,所以就得捕獲它并處理它。
1 //利用try-catch語句塊捕獲異常2 try{3 code4 }5 catch(ExceptionType e){6 handler for this type7 }
如果在try語句塊中的代碼拋出了一個在catch子句中說明的異常類,那么
1)程序將跳過try語句塊的其他代碼。
2)程序將執行catch子句中的處理器代碼
(5)異常-方法內外
對于異常,可以在方法內部用try-catch語句塊來捕獲并處理,如果不想在方法內處理,可以在方法首部聲明可能拋出的異常,將異常可能拋出的異常交給調用方法的代碼去處理。總之,就是方法內用try-catch處理,方法外用throws拋出。
(6)捕獲多個異常
1 try{2 code3 }4 catch(FileNotFoundException | UnknowHostException e){5 ...6 }7 catch(IOException e){8 ...9 }
(7)finally
1 try{2 ...3 }4 catch(IOException e){5 ...6 }7 finally{8 ...9 }
不管有沒有異常發生,finally語句塊中的代碼都將執行。
try-catch、try-catch-finally、try-finally三種組合,1、3組合更常用
(8)帶資源的try語句塊
帶資源的try塊在退出時,會自動關閉資源,這樣往往就可以省掉finally語句
1 try(Scanner in = new Scanner(new FileInputStream(“文件路徑”))){2 while(in.hasNext())3 System.out.PRintln(in.next());4 }
注:╮(╯▽╰)╭本文大量參考《Java核心技術 卷I》
新聞熱點
疑難解答