標籤:
一、概念和分類
JAVA程式設計語言中,異常對象都是Throwable類的一個執行個體。
其中,Error類階層描述了JAVA運行時系統的內部錯誤和耗盡錯誤。這種錯誤無法操作,不會拋出。在設計JAVA程式時,我們需要關注Exception。
Exception包含兩個分支:RuntimeException和其他異常。劃分兩個分支的規則是:由程式錯誤導致的異常屬於RuntimeException,而程式本身沒有問題,但由於I/O錯誤這類問題導致的異常屬於其他異常。
RuntimeException即是運行時異常,即在程式啟動並執行時候才出現的異常,又稱“未檢查異常”,意即“編譯器未檢查出的異常”。
派生於RuntimeException的異常包含下面幾種情況:
- 錯誤的類型轉換。
- 數組訪問越界
- 訪問null 指標
其他異常包括:
- 試圖在檔案發問後面讀取資料
- 試圖開啟一個不存在的檔案。
- 試圖根據給定的字串尋找Class對象,而這個字串表示的類並不存在。
二、異常的聲明
在JAVA的方法裡,如果可能遇到無法處理的情況,比如要開啟的檔案並不存在,這時就要聲明異常。聲明異常的方法是在方法的首部聲明所有可能拋出的異常。比如標準類庫中的FileInputStream類的一個構造器的聲明:
一個方法必須聲明所有可能拋出的已檢查異常(Exception中RuntimeException之外的其他異常),而未檢查異常要麼不可控制(Error),要麼就應該避免發生(RuntimeException)。
如果一個方法沒有聲明所有可能發生的已檢查異常,編譯器就會報錯。
三、異常的拋出
異常的拋出使用“throw”關鍵字,比如一個方法可能出現EOFException,我們希望它拋出這個異常,可以用下面的語句:
throw new EOFExcetion();
或:
EOFExcetion e = new EOFException(); throw e;
如果一個方法裡使用了throw關鍵字拋出了一個異常,並且這個異常又不是RuntimeException,那麼必須在方法首部用throws聲明這個異常。
如果一個方法用throws聲明了一個異常,那麼調用這個方法的方法就必須對這個異常進行捕獲,或者繼續聲明。(這個有一點例外,如果父類方法中沒有聲明異常,那麼子類在覆蓋父類這個方法的時候也不能聲明異常,見JComponent.paintComponent方法)
四、建立異常類
有時候我們可能會遇到所有標準異常類都無法準確處理的問題,比如 int age = -1;這行代碼本身沒有什麼問題,但是實際上年齡不可能為負數。這個時候我們就需要自己來建立一個異常類:
五、異常的捕獲
如果某個異常沒有在任何地方進行捕獲,那麼程式就會終止執行,並在控制台上列印出異常資訊,其中包括異常的類型和堆棧和內容。
要想捕獲一個異常,必須設定 try/catch 語句塊:
try{ someCode; }catch(ExceptionType e){ handle for this Exception; }
- 如果在try語句塊中的任何代碼拋出了一個在catch子句中說明的異常類,那麼程式將跳過try語句塊的其餘代碼,並且執行catch子句中的處理代碼。
- 如果在try語句塊中的代碼沒有拋出任何異常,那麼程式將跳過catch語句。
- 如果方法中的任何代碼拋出了一個在catch子句中沒有聲明的異常類型,那麼這個方法就會立刻退出。
JAVA裡的異常