其他JAVA學習的內容見:目錄
異常概述
- 程序面對複雜度情況,例如:程序編寫可能出錯;用戶的輸入出錯;程序所在的操作系統出錯;網絡不通等。
- 異常:運行期出現的錯誤
try{
//業務邏輯實現代碼
...
}catch(Exception e){
處理錯誤
}
- Java異常:一種用於處理程序中錯誤的機制。
- 程序運行出現意外情況時,JVM生成一個Exception對象來通知程序。
- 錯誤:程序運行過程中發生的異常事件。
- 例如:除數爲0,數組下標越界。
- 說明:設計良好的程序應在異常發生時提供處理錯誤的方法,程序不會因爲錯誤發生而阻斷或發生不可預見的錯誤。
- 流程:
Java異常分類
-
分類方法(1)
- Error:錯誤,由JVM生成並拋出,如虛擬機錯誤,程序不做處理(少見)。
- Exception:所有異常類的父類(可以處理的錯誤)。
- RuntimeException
- 例如:數組訪問越界,訪問空指針
- 經常出的錯誤,可catch可不catch。
- 編程導致的錯誤,程序員的錯誤。
- 非RuntimeException
- 試圖讀一個磁盤上不存在的文件:IOException
- RuntimeException
- 理解:
- 如果出現RuntimeException,就一定是程序員的問題
- RuntimeException名字易引起誤會,實際上所有的異常都發生在運行時刻
-
分類方法(2)
- 未檢查(unchecked)異常
- 包括:Error的子類異常 && RuntimeException的子類異常。
- 特點:不能由編譯器檢查;可以通過編程避免。
- 已檢查(checked)異常:unchecked以外的異常
- 特點:編譯時檢查,提高了程序的安全性
- 未檢查(unchecked)異常
聲明拋出異常
- 方法:可以告訴編譯器該方法有可能發生的錯誤。
public FileInputStream(String name) throws FileNotFoundException
- 方法何時用throws聲明要拋出的異常?
- 調用了一個拋出已檢查異常的方法,方法中沒有處理異常。
- 程序運行時發現錯誤,利用
throw
拋出一個異常,方法中沒有處理異常。
- 若一個方法拋出多個Checked異常,則在方法定義頭部列出所有的異常,每個異常用“,”分開。
void method1() throws Exception1,Exception2,...
- 總結
- 程序不應該聲明:
- Error繼承來的異常
- 從RuntimeException繼承來的異常(程序應該可以控制)。
- 若方法中沒有對異常進行處理,則必須在方法頭中用throws聲明方法可能拋出的異常(已檢查異常)。
- 一個方法拋出多個已檢查異常,在
throws
後全部列出。 - 一個方法應該聲明所有可能拋出的已檢查異常,而未檢查異常要麼不可控制(Error),要麼應該避免發生
- 程序不應該聲明:
異常的捕獲和處理
- 方法處理異常的原則
- 處理方法能夠處理的異常
- 不能處理的異常:拋出
- 聲明拋出已知的異常:如方法定義中拋出的異常
- 代碼中手工拋出:throw new ***Exception()
自定義異常
- 自定義異常的方法
- 繼承Exception或RuntimeException,形成異常類。
- 構造方法:
- 無形參的構造方法
- String形參的構造方法,String作爲異常對象的描述信息
public class AuctionException extends Exception{
// 無參數的構造器
public AuctionException(){}
// 帶一個字符串參數的構造器
public AuctionException(String msg){
super(msg);
}
}
方法重寫中的異常處理
- 重寫方法需要拋出與原方法所拋出異常類型一致(相同的類或子類)的異常或不拋出異常
class A {
public void method() throws IOException{...}
}
class B1 extends A{
public void method() throws FileNotFoundException{...}
}
class B2 extends A{
public void method() throws Exception{...}
}//錯誤的
class B3 extends A{
public void method(){...}
}