Java學習日記9-異常,Java學習日記9-
異常(Exception)
一、什麼是異常?
異常就是程式中的錯誤,比如數組越界、訪問null 指標等。在Java中,一切皆對象,異常也不例外。所有的異常都是派生於Throwable類的一個執行個體對象。
二、異常的分類
在異常界,有兩大流派。一派叫Error類,另一派叫Exception類,它們都繼承自Throwable類。在Exception類下還有兩大分支,IOException類和RuntimeException類。
RuntimeException是由程式本身的錯誤導致的異常。
IOException是程式本身沒有問題,但是因為IO發生的錯誤引起的異常。
舉例:
RuntimeException |
IOException |
數組訪問越界 |
試圖開啟一個不存在的檔案 |
訪問null 指標 |
試圖在檔案尾部讀取資料 |
錯誤的類型轉換 |
|
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》