1. 程式人生 > 其它 >Head First Java學習:第十一章-異常處理

Head First Java學習:第十一章-異常處理

第十一章 異常處理

1、方法可以抓住其他方法所丟擲的異常;異常總是丟回給呼叫方

  • 有風險、會丟擲異常的程式程式碼:

        負責宣告異常;建立Exception物件並丟擲

  • 呼叫該方法的程式程式碼:

        在try中呼叫程式程式碼;在catch中捕獲異常,並使用printStackTrace()獲取有用資訊。

舉例:

// 有風險的程式碼
public void takeTest() throws BadException{
    if (abandonAllHope){
        throw new BadException();
    }
}

// 呼叫上述風險的程式程式碼
public void crossFingers(){
    try{
        anObject.takeTest();
    }catch (BadException ex){
        System.out

.println("有異常");
        ex.printStackTrace();
    }
}

2、異常的分類

Exception:程式需要捕捉處理的異常,分為checked exception(檢查異常)和unchecked exception(不檢查異常)。

checked exception:方法在申明過程中證明了有檢查異常丟擲,呼叫該方法的時候,一定要處理(捕獲或者向上丟擲),否則無法編譯通過。比如IOException。

如果我們希望我們的方法呼叫者,明確處理一些特殊情況的時候,就應該使用checked exception。

unchecked exception:一般是執行期異常,繼承自RuntimeException。編寫程式碼時不需要顯示捕獲。但是如果不捕獲,執行期發生異常就會中斷程式的執行。比如空指標異常、陣列越界異常,這些都是可以避免的。一般是程式邏輯導致的異常。

3、異常的關鍵字:

throws 申明一個方法可能丟擲的各種異常

throw 明確丟擲一個異常,如 throw new BadException();

try 用來指定一塊預防所有異常的程式

catch 指定你想要捕獲的異常型別

finally 確保一段程式碼不管發生什麼異常狀態都要被執行

4、正確處理異常

方式一:自己明確知道如何處理。自己處理。

方式二:不知道如何處理。向上拋,交給呼叫者處理。

5、try、catch、finally的執行順序

如果try塊失敗了:丟擲異常,流程會馬上轉移到 catch塊。catch塊完成會轉移到finally塊。當finally執行完成時,就會繼續執行其餘部分。

如果try塊成功了:流程會跳過catch塊並移動到finally塊。當finally執行完成時,就會繼續執行其餘部分。

如果try或catch塊有return指令:finally還是會執行!流程會跳到finally,然後再回到return指令。

6、處理多重異常

舉例:

public class Laundry{

public void doLaundry() throws PantsException,LingerieException{

    // 有可能丟擲兩個異常的程式程式碼

}

}

public class Foo{

public void go(){

    try{

        Laundry.do Laundry();

    }catch(PantsException pex){

        // 恢復程式程式碼

    } catch(LingerieException Lin){

        // 恢復程式程式碼

    }

}

}

7、異常也有多型

以為異常是物件,所以異常能夠以多型的方式來引用。

比如IOException的物件,可以賦值給Exception的引用。

好處:

不用宣告每個可能丟擲的異常,可以只宣告父類。

對於catch,可以不對每個可能的異常處理,只要一個或少數幾個catch可以處理所有異常。

8、不想處理異常,那就 ducking

舉例:

public class Washer {
    Laundry laundry = new Laundry();
    public void foo() throws ClothingException{
        laundry.doLaunrdy();
    }

    public static void main(String[] args) throws ClothingException{
        Washer a = new Washer();
        a.foo();
    }
}

呼叫方也宣告相同異常,就會duck掉(踢皮球)。