所有的異常都是從Throwable 的類派生出來的。throwable下面有三種結(jié)構(gòu):受檢異常、運(yùn)行時(shí)異常和錯(cuò)誤。
一、受檢異常
如果期望調(diào)用者在遇到異常后可以進(jìn)行恢復(fù)的操作,那么使用受檢異常,也就是 xxx extends Exception的異常。例子:數(shù)據(jù)庫斷連,拋出受檢異常,讓調(diào)用者再去嘗試連接。
下面列出了主要的檢查異常
· ClassNotFoundException : 找不到類或接口所產(chǎn)生的異常。
· CloneNotSupportedException : 使用對(duì)象的 clone( )方法但無法執(zhí)行 Cloneable所產(chǎn)生的異常。
· IllegalAccessException : 類定義不明確所產(chǎn)生的異常。
· InstantiationException : 使用 newInstance( )方法試圖建立一個(gè)類 instance時(shí)所產(chǎn)生的異常。
· InterruptedException : 目前線程等待執(zhí)行,另一線程中斷目前線程所產(chǎn)生的異常。
二、運(yùn)行時(shí)異常
如果不希望調(diào)用者進(jìn)行恢復(fù),想直接中斷程序的運(yùn)行,則拋出運(yùn)行時(shí)異常,也就是 xxx extends RuntimeException的異常。當(dāng)我們需要自定義運(yùn)行時(shí)異常時(shí),應(yīng)該去繼承RuntimeException。例子:數(shù)組越界異常,屬于代碼中沒有做好充足的校驗(yàn),訪問了越界的元素。
public class arrayIndex {
public static void main(String args[]) {
int[] i = { 1, 2, 3, 4, 5 };
for (int j = 0; j < 6; j++) {
System.out.println(i[j]);
}
}
}
修改后:
public class arrayIndex {
public static void main(String args[]) {
int[] i = { 1, 2, 3, 4, 5 };
for (int j = 0; j < i.length; j++) {
System.out.println(i[j]);
}
}
}
下面列出了主要的運(yùn)行時(shí)異常
· ArithmeticException : 一個(gè)非法算術(shù)運(yùn)算產(chǎn)生的異常。
· ArrayStoreException : 存入數(shù)組的內(nèi)容數(shù)據(jù)類型不一致所產(chǎn)生的異常。
· ArrayIndexOutOfBoundsException : 數(shù)組索引超出范圍所產(chǎn)生的異常。
· ClassCastException : 類對(duì)象強(qiáng)迫轉(zhuǎn)換造成不當(dāng)類對(duì)象所產(chǎn)生的異常。
· IllegalArgumentException : 程序調(diào)用時(shí),返回錯(cuò)誤自變量的數(shù)據(jù)類型。
· IllegalThreadStateException : 線程在不合理狀態(tài)下運(yùn)行所產(chǎn)生的異常。
· NumberFormatException : 字符串轉(zhuǎn)換為數(shù)值所產(chǎn)生的異常。
· IllegalMonitorStateException : 線程等候或通知對(duì)象時(shí)所產(chǎn)生的異常。
· IndexOutOfBoundsException : 索引超出范圍所產(chǎn)生的異常。
· NegativeException : 數(shù)組建立負(fù)值索引所產(chǎn)生的異常。
· NullPointerException : 對(duì)象引用參考值為 null所產(chǎn)生的異常。
· SecurityException : 違反安全所產(chǎn)生的異常。
三、錯(cuò)誤
Error(錯(cuò)誤)表示系統(tǒng)級(jí)的錯(cuò)誤和程序不必處理的異常,是java運(yùn)行環(huán)境中的內(nèi)部錯(cuò)誤或者硬件問題,比如,內(nèi)存資源不足、操作系統(tǒng)出錯(cuò)。在大多數(shù)情況下,當(dāng)遇到這樣的錯(cuò)誤時(shí),建議讓該程序中斷。這樣的異常超出了程序可控制的范圍。
受檢異常和運(yùn)行時(shí)異常不同之處
public class ExceptionTypeTest {
public void doSomething() throws ArithmeticException {
System.out.println();
}
public static void main() {
ExceptionTypeTest ett = new ExceptionTypeTest();
ett.doSomething();
}
}
問題1:上面的程序能否編譯通過?并說明理由。
答:能編譯通過。按照一般常理,定義doSomething方法是定義了ArithmeticException異常,在main方法里調(diào)用了該方法,應(yīng)當(dāng)繼續(xù)拋出或者捕獲異常。但是ArithmeticException extends RuntimeException。對(duì)于運(yùn)行時(shí)異常,java編譯器不要求你一定要把它捕獲或者拋出。
問題2:上面的程序?qū)rithmeticException改為IOException能否編譯通過?并說明理由。
答:不能編譯通過。IOException extends Exception,受檢異常必須進(jìn)行處理,捕獲或者拋出)。