【javase複習】## day5 異常 ##

day 異常

這裏寫圖片描述

異常的體系:
———-| Throwable 所以異常或者錯誤類的超類
————–|Error 錯誤 錯誤一般是用於jvm或者是硬件引發的問題,所以我們一般不會通過代碼去處理錯誤的。
————–|Exception 異常 是需要通過代碼去處理的。
——————| 運行時異常: 如果一個方法內部拋出了一個運行時異常,那麼方法上 可以聲明也可以不 聲明,調用者可以以處理也可以不處理。
——————| 編譯時異常(非運行時異常、受檢異常): 如果一個方法內部拋出了一個編譯時異常對象,那麼方法上就必須要聲明,而且調用者也必須要處理。

運行時異常: RuntimeException以及RuntimeException子類 都是屬於運行時異常。



疑問: 爲什麼java編譯器會如此嚴格要求編譯時異常,對運行時異常如此寬鬆?
運行時異常都是可以通過程序員良好的編程習慣去避免,所以java編譯器就沒有嚴格要求處理運行時異常。




首先要了解Throwable裏的常用方法,在eclipse常用的自動生成try catch的語句中,總是使用了e.printStackTrace,但是不清楚到底怎麼用或者指代什麼意思,只知道是描述了異常的詳細信息, 之前看過的視頻都很籠統, 也沒有深究過,大概只是知道這麼一個格式, 鍾老師的講解很仔細。這裏做一下筆記

Throwable常用的方法:
toString() 返回當前異常對象的完整類名+病態信息(Message)。
getMessage() 返回的是創建Throwable傳入的字符串信息。
printStackTrace() 打印異常的棧信息。

如何理解這個Message呢? 翻開API查看Throwable類我們發現有一個構造方法可以Throwable(String Message);看到這裏我們就清楚了,如果是jvm幫我們自動拋出的異常是沒有message的,這時的值是Null。

如何理解printStackTrace, 異常的棧信息呢?
用以下代碼進行一個測試

class Demo8 
{
    public static void main(String[] args) 
    {


        test();
    }

    public static void test(){
        //
        Throwable t = new Throwable("sb");
        t.printStackTrace();
    }
}

這裏寫圖片描述

分析結果:
首先打印toString的結果,然後換行依次打印錯誤的棧信息,運行時首先執行test方法,在12行的test方法中出現了這個異常,但是因爲沒有處理,繼而導致了第7行的test(); 調用方法語句也出現了異常。這樣便於我們追根溯源





異常的處理方式

1: 捕獲處理

即用try catch語句

捕獲處理要注意的細節:
1. 如果try塊中代碼出了異常經過了處理之後,那麼try-catch塊外面的代碼可以正常執行。
2. 如果try塊中出了異常的代碼,那麼在try塊中出現異常代碼後面的代碼是不會執行了。
3. 一個try塊後面是可以跟有多個catch塊的,也就是一個try塊可以捕獲多種異常的類型。
4. 一個try塊可以捕獲多種異常的類型,但是捕獲的異常類型必須從小到大進行捕獲,否則編譯報錯。

注意第四點:實際上jvm是每次運行一句try中的語句, 就去尋找每一個catch是否有對應。並且是嚴格按照順序從上往下的。如果先捕獲大異常,則捕獲具體異常的語句得不到執行。




2:拋出處理

拋出處理要注意的細節:
1. 如果一個方法內部拋出了一個異常對象,那麼throw語句後面的代碼都不會再執行了(一個方法遇到了throw關鍵字,該方法也會馬上停止執行的)。
2. 在一種情況下,只能拋出一種類型異常對象。



throw 與throws兩個關鍵字:
1. throw關鍵字是用於方法內部的,throws是用於方法聲聲明上的。
2. throw關鍵字是用於方法內部拋出一個異常對象的,throws關鍵字是用於在方法聲明上聲明拋出異常類型的。
3. throw關鍵字後面只能有一個異常對象,throws後面一次可以聲明拋出多種類型的 異常。





自定義異常類

java提供的異常類雖然多,但是依然不能滿足所有的需要。如果要創建一個專屬的異常,我們需要創建一個類,繼承Throwable類即可。當然我們也可以重寫構造方法,和常用方法。

那麼這個自定義異常類如何使用呢?要使用必定要拋出,問題是我們如何拋出
① 直接用在方法上if語句拋出
② 將可能拋出異常的語句封裝成一個方法,並讓這個方法throws 我們創建的異常。然後調用這個方法即可。

class NoMoneyException extends Exception {

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

}



class Demo3 
{
    public static void main(String[] args) 
    {
        //System.out.println("Hello World!");
        try{
            eat(9);

        }catch(NoMoneyException e){
            e.printStackTrace();
            System.out.println("跟我洗碗一個月!!");
        }
    }


    public static void eat(int money) throws NoMoneyException{
        if(money<10){
            throw new NoMoneyException("吃霸王餐");
        }
        System.out.println("吃上了香噴噴的地溝油木桶飯!!");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章