JAVA 基礎知識點複習(十四)異常

異常定義

按照面向對象的思想對程序運行時其發生的不正常情況進行描述和對象的封裝

除非你能解決(或必須要處理)這個異常,否則不要捕獲它,如果打算記錄錯誤消息,那麼別忘了把它再拋出去

分類
在這裏插入圖片描述

Throwable是所有異常的父類

Error表示很嚴重的問題發生了,可以捕獲但是不要捕獲,因爲捕獲了也解決不了,這個不是由程序產出的,底層出現問題就讓他它掛了吧。

關鍵字

throws:用來聲明異常,作用在方法上,後面跟的是異常類

throw:用來拋出異常,作用在方法內,後面跟的是異常對象,throw之後的語句不會被執行

解決異常

在循環體內catch異常,不會終止循環

異常的處理方式有兩種,一種是在方法層面拋出,由調用者處理。一種是捕獲try{}catch{}finally{}

而對於運行時異常以及他的子類來說可以不聲明也不捕獲,目的就是讓程序停止

    // 直接拋出
    private static String toStringUTF8() throws UnsupportedEncodingException {
        return new String(new byte[1024], "utf8");
    }
    
    // 捕獲
    private static String toStringUTF8(){
        try {
            return new String(new byte[1024], "utf8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

具體場景:

1.對於認定一定不會發生的異常

// 字節數組轉通過UTF-8解碼成字符串的工具類
// jvm必然能識別utf8的編碼格式,但是如果寫成了ufo8呢?所以必須打印日誌
public static String toStringUTF8(byte[] bytes){
        try {
            return new String(bytes, "utf8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace(); // 1.捕獲並且打印相關日誌 2.捕獲但什麼都不做
        }
        return null;
    }

2.對假定不應該出現的異常

// 字符集由調用者傳入,可能出現錯誤的字符集
// 直接拋異常或者捕獲打印日誌都不好,調用者並不清楚是自己傳錯了只能事後查看日誌,應該拋出運行時異常
public static String toStringUTF8(byte[] bytes, String charsetName){
        try {
            return new String(bytes, charsetName);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e); // 拋出運行時異常
        }
    }

3.對假定一定會出現問題的異常

拿回去重寫

自定義異常

// 繼承Exception或者RuntimeException,重寫常規方法
public class MyException extends RuntimeException {

    public MyException(String message) {
        super(message);
    }
}

try…catch…finally

// 只是捕獲異常
try {} catch (Exception e) {}
// 不處理異常,但是需要釋放資源,必須聲明異常(finally中的代碼一定會執行)
try {} finally {}
// 捕獲多個異常,如果catch()中的異常類存在父子異常,則子異常一定要放在上面
try {} catch (NullPointerException e) {} catch (Exception e) {}
// jdk7的新語法,在try()中聲明的資源會自動關閉
try (FileInputStream fis = new FileInputStream("")) {} catch (Exception e) {}

執行順序:

在同一try…catch…finally中,如果try拋出了異常且有配的catch,則先執行catch再執行finally,

如果沒有匹配的catch則先執行finally再去外部調用者尋找catch,

如果catch匹配成功但是也拋出了異常,還是先執行finally再去外部調用者尋找catch

注意:

finally中的return會覆蓋try或catch中的return,也會抑制try或catch中的異常(當做沒異常發生)

finally中的異常會覆蓋try或catch中的異常

finally中的代碼一定會執行,除非JVM掛了,或者執行了System.exit(0)

子類重寫父類的方法,只能拋出父類的異常或者異常的子類。如果父類沒有拋出異常,則子類只能捕獲。

Throwable三個常用方法

// 異常信息  / by zero
System.out.println(e.getMessage());
// 異常類名 + 異常信息 java.lang.ArithmeticException: / by zero
System.out.println(e.toString()); 
// 異常類名 + 異常信息,以及異常出現在程序中的位置(最常用的)
e.printStackTrace();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章