第58條 對(duì)可恢復(fù)的情況使用受檢異常,對(duì)編程錯(cuò)誤使用運(yùn)行時(shí)異常

所有的異常都是從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)行處理,捕獲或者拋出)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容