簡(jiǎn)介
Throwable類是Java異常類型的頂層父類道批,一個(gè)對(duì)象只有是 Throwable 類的(直接或者間接)實(shí)例错英,他才是一個(gè)異常對(duì)象,才能被異常處理機(jī)制識(shí)別隆豹。JDK中內(nèi)建了一些常用的異常類椭岩,我們也可以自定義異常。
Java標(biāo)準(zhǔn)庫內(nèi)建了一些通用的異常璃赡,這些類以Throwable為頂層父類判哥。
Throwable又派生出Error類和Exception類。
錯(cuò)誤: Error類以及他的子類的實(shí)例碉考,代表了JVM本身的錯(cuò)誤塌计。錯(cuò)誤不能被程序員通過代碼處理,Error很少出現(xiàn)侯谁。因此夺荒,程序員應(yīng)該關(guān)注Exception為父類的分支下的各種異常類。
異常: Exception以及他的子類良蒸,代表程序運(yùn)行時(shí)發(fā)送的各種不期望發(fā)生的事件技扼。可以被Java異常處理機(jī)制使用嫩痰,是異常處理的核心剿吻。
Java異常的分類和類結(jié)構(gòu)圖
分類
總體上我們根據(jù)Javac對(duì)異常的處理要求,將異常類分為2類串纺。
非檢查異常(unckecked exception): Error 和 RuntimeException 以及他們的子類丽旅。javac在編譯時(shí),不會(huì)提示和發(fā)現(xiàn)這樣的異常纺棺,不要求在程序處理這些異常榄笙。所以如果愿意,我們可以編寫代碼處理(使用try…catch…finally)這樣的異常祷蝌,也可以不處理茅撞。對(duì)于這些異常,我們應(yīng)該修正代碼巨朦,而不是去通過異常處理器處理 米丘。這樣的異常發(fā)生的原因多半是代碼寫的有問題。如除0錯(cuò)誤ArithmeticException糊啡,錯(cuò)誤的強(qiáng)制類型轉(zhuǎn)換錯(cuò)誤ClassCastException拄查,數(shù)組索引越界ArrayIndexOutOfBoundsException,使用了空對(duì)象NullPointerException等等棚蓄。
檢查異常(checked exception): 除了Error 和 RuntimeException的其它異常堕扶。javac強(qiáng)制要求程序員為這樣的異常做預(yù)備處理工作(使用try…catch…finally或者throws)碍脏。在方法中要么用try-catch語句捕獲它并處理,要么用throws子句聲明拋出它稍算,否則編譯不會(huì)通過典尾。這樣的異常一般是由程序的運(yùn)行環(huán)境導(dǎo)致的。因?yàn)槌绦蚩赡鼙贿\(yùn)行在各種未知的環(huán)境下邪蛔,而程序員無法干預(yù)用戶如何使用他編寫的程序,于是程序員就應(yīng)該為這樣的異常時(shí)刻準(zhǔn)備著扎狱。如SQLException , IOException,ClassNotFoundException 等侧到。
需要明確的是: 檢查和非檢查是對(duì)于javac來說的,這樣就很好理解和區(qū)分了淤击。
自定義異常
自定義異常
如果要自定義異常類匠抗,則擴(kuò)展Exception類即可,因此這樣的自定義異常都屬于檢查異常(checked exception)污抬。如果要自定義非檢查異常汞贸,則擴(kuò)展自RuntimeException。
按照國(guó)際慣例印机,自定義的異常應(yīng)該總是包含如下的構(gòu)造函數(shù):
- 一個(gè)無參構(gòu)造函數(shù)
- 一個(gè)帶有String參數(shù)的- 構(gòu)造函數(shù)矢腻,并傳遞給父- 類的構(gòu)造函數(shù)。
- 一個(gè)帶有String參數(shù)和T- hrowable參數(shù)射赛,并都傳- 遞給父類構(gòu)造函數(shù)
- 一個(gè)帶有Throwable 參數(shù)的構(gòu)造函數(shù)多柑,并傳遞給父類的構(gòu)造函數(shù)。
下面是IOException類的完整源代碼楣责,可以借鑒竣灌。
public class IOException extends Exception
{
static final long serialVersionUID = 7818375828146090155L;
public IOException()
{
super();
}
public IOException(String message)
{
super(message);
}
public IOException(String message, Throwable cause)
{
super(message, cause);
}
public IOException(Throwable cause)
{
super(cause);
}
}