第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