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掉(踢皮球)。
浙公網安備 33010602011771號