天天看點

Java學習路線-10:異常第27 章 : 異常的捕獲及處理

第27 章 : 異常的捕獲及處理

116 認識異常對程式的影響

出現錯誤後,程式中斷執行

為了保證程式出現非緻命錯誤之後,程式依然可以正常完成

異常處理機制保證程式的順利執行

117 處理異常

文法

try{

} catch(異常類型 異常對象){
    // 處理異常

} catch(異常類型 異常對象){
    // 處理異常
}
...
finally{
    // 不管是否出現異常都會執行
}
      

異常

System.out.println(2/0);
// java.lang.ArithmeticException: / by zero      

異常捕獲

try{
    System.out.println(2/0);
}
catch(ArithmeticException e){
    System.out.println(e);
    // java.lang.ArithmeticException: / by zero
}      

列印完成的異常資訊

printStackTrace()

try{
    System.out.println(2/0);
}
catch(ArithmeticException e){
    e.printStackTrace();
    // java.lang.ArithmeticException: / by zero
    // at Demo.main(Demo.java:4)
}      

118 處理多個異常

如果明确知道會發生什麼異常,可以使用if做判斷

119 異常處理流程

Error 程式還未執行性出現的錯誤,開發者無法處理

Exception 程式中出現的異常,開發者可以處理

異常體系

Object
    -Throwable
        -Exception      

所有異常都可以用 Exception 處理

捕獲範圍大的異常要放在最後

120 throws關鍵字

告訴調用者可能會出現的異常

如果主方法繼續抛出異常,表示此異常交由JVM處理

class Demo{

    public static int div(int x, int y) throws ArithmeticException{
        return x / y;
    }
    
    public static void main(String[] args) {
        try{
            int x = div(1, 0) ;
        }catch(ArithmeticException e){
            e.printStackTrace();
        }
        
    }
}
      

121 throw關鍵字

手動抛出異常

try{
    throw new Exception("主動抛出異常");
}catch(Exception e){
    e.printStackTrace();
    // java.lang.Exception: 主動抛出異常
}      

差別:throw & throws

throw 在代碼塊中使用,主動抛出異常對象

throws 在方法定義上使用,明确告訴調用者可能産生的異常

122 異常處理模型

try{
    result = x / y;
} catch(Exception e){
    throw e;
}finally{
    System.out.println("結束...");
}
      

簡化寫法

try{
    result = x / y;
} finally{
    System.out.println("結束...");
}      

123 RuntimeException

函數定義标注了可能抛出的異常,不過并沒有要求強制處理

差別 RuntimeException & Exception

RuntimeException 是 Exception子類

RuntimeException 子類不要求強制處理異常

Exception 必須處理

124 自定義異常類

繼承 RuntimeException(可選處理),Exception(必須處理)

// 如果繼承自Exception 
// 錯誤: 未報告的異常錯誤MyException; 必須對其進行捕獲或聲明以便抛出
class MyException extends RuntimeException{
    public MyException(String message){
        super(message);
    }
}

class Demo{
    public static void main(String[] args) {
        throw new  MyException("自定義異常");
        // Exception in thread "main" MyException: 自定義異常
    }
}
      

125 assert斷言

JDK >= 1.4

确定代碼執行到某行之後,一定是所期待的結果

不一定是準确的,也可能出現偏差,但是這種偏差不應該影響程式的正常執行

Java中的斷言需要指定運作參數才生效

int x = 9 ;
assert x == 10;      

編譯運作沒有任何結果

啟用斷言

java -ea Demo      

程式抛出異常

Exception in thread "main" java.lang.AssertionError