Java 的異常處理模型基於以下三種操作:
聲明一個異常(declaring an exception)拋出一個異常(throwing an exception)捕獲一個異常(catching an exception)聲明異常
每個方法都必須聲明它可能拋出的必檢異常的類型,這稱為聲明異常(declaring exception)
不要求在方法中顯式聲明 Error 和RuntimeException (免檢異常)但是,方法要拋出的其他異常都必須在方法頭中顯式聲明,這樣,方法的調用者會被告知有異常。
為了在方法中聲明一個異常,需要在方法頭中使用關鍵字 throws,例如:publicvoidmyMethod( )throws IOException {// 方法體}//關鍵字 throws 表明 myMethod 方法可能會拋出異常 IOException//如果方法可能會拋出多個異常, 就可以在關鍵字 throws 後添加一個用逗號分隔的異常列表:public void myMethod()throws Exceptionl, Exception2, … , ExceptionN
聲明異常也是方法籤名的一部分。因此,在繼承類並重寫父類的方法時,對子類方法的聲明異常部分也有嚴格的要求:
如果父類的方法沒有聲明某種類型異常,那麼在子類中重寫該方法時也不能增加聲明這種類型的異常。也就是說,子類方法聲明異常的範圍不能超過父類方法聲明的異常範圍。拋出異常
檢測到錯誤的程序可以創建一個合適的異常類型的實例並拋出它, 這就稱為拋出一個異常(throwing an exception)。
如:
某個程序發現傳遞給方法的參數與方法參數的要求不符(例如,方法中的參數必須是非負的,但是傳入的是一個負參數), 這個程序就可以創建 IllegalArgumentException的一個實例並拋出它
IllegalArgumentException ex =new IllegalArgumentException("參數錯誤");throw ex;
或者使用下面的語句:
thrownew IllegalArgumentException("參數錯誤");
一般情況下,Java API 中的每個異常類都至少包含兩個構造方法:
一個無參構造方法和 一個帶 String 類型參數的構造方法。
該String類型的參數稱為異常消息(exception message),可以調用getMessage()方法來獲取該消息。
關於throws 與 throwthrows 關鍵字用於聲明異常,其位置是方法頭部的最後,方法體開始的 { 之前。throw 關鍵字則用來拋出異常,其位置是方法體中。throw和throws關鍵字之間的聯繫如果在某方法中使用throw拋出了某種 unchecked exception而該throw語句並未使用 try-catch結構進行異常處理則throw語句所在的方法必須使用throws關鍵字進行該異常類的聲明,否則產生編譯錯誤。需要注意的是:
採用 throw關鍵字拋出異常之後,本次方法的調用即告結束,程序的流程直接返回到本次方法的調用者那裡。儘管被調用的方法代碼可能並沒有全部執行,也沒有執行return語句。這與try塊中的代碼產生異常之後,直接運行相應的catch塊,流程的轉移方面二者是類似的。