一個 try 代碼塊后面跟隨多個 catch 代碼塊的情況就叫多重捕獲。
多重捕獲塊的語法如下所示:
```
try{
// 程序代碼
}catch(異常類型1 異常的變量名1){
// 程序代碼
}catch(異常類型2 異常的變量名2){
// 程序代碼
}catch(異常類型3 異常的變量名3){
// 程序代碼
}
```
上面的代碼段包含了 3 個 catch塊。
可以在 try 語句后面添加任意數量的 catch 塊。
如果保護代碼中發生異常,異常被拋給第一個 catch 塊。
如果拋出異常的數據類型與 ExceptionType1 匹配,它在這里就會被捕獲。
如果不匹配,它會被傳遞給第二個 catch 塊。
如此,直到異常被捕獲或者通過所有的 catch 塊。
<br>
<br>
**異常案例一:**
```
package day02try;
public class day04Excption {
public static void main(String args[]) {
try {
int a = args.length;
System.out.println("a = " + a);
int b = 42 / a;
int c[] = { 1 };
c[42] = 99;
} catch(ArithmeticException e) {
System.out.println("Divide by 0: " + e);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Array index oob: " + e);
}
System.out.println("After try/catch blocks.");
}
}
```
該程序在沒有命令行參數的起始條件下運行導致被零除異常,因為a為0。如果你提供一個命令行參數,它將幸免于難,把a設成大于零的數值。但是它將導致ArrayIndexOutOf?BoundsException異常,因為整型數組c的長度為1,而程序試圖給c\[42\]賦值。
下面是運行在兩種不同情況下程序的輸出:
>>>java MultiCatch
a = 0
Divide by 0: java.lang.ArithmeticException: / by zero?After try/catch blocks.
>>>java MultiCatch TestArg
a = 1
Array index oob: java.lang.ArrayIndexOutOfBoundsException?After try/catch blocks.
<br>
<br>
當你用多catch語句時,記住異常子類必須在它們任何父類之前使用是很重要的。這是因為運用父類的catch語句將捕獲該類型及其所有子類類型的異常。這樣,如果子類在父類后面,子類將永遠不會到達。而且,Java中不能到達的代碼是一個錯誤。例如,考慮下面的程序:
```
class SuperSubCatch {
? ? public static void main(String args\[\]) {
? ? ? ? try {
? ? ? ? ? ? int a = 0;
? ? ? ? ? ? int b = 42 / a;
? ? ? ? } catch(Exception e) {
? ? ? ? ? ? System.out.println("Generic Exception catch.");
? ? ? ? }
? ? ? ? /\* This catch is never reached because
? ? ? ? ArithmeticException is a subclass of Exception. \*/
? ? ? ? catch(ArithmeticException e) { // ERROR - unreachable
? ? ? ? ? ? System.out.println("This is never reached.");
? ? ? ? }
? ? }
}
```
如果你試著編譯該程序,你會收到一個錯誤消息,該錯誤消息說明第二個catch語句不會到達,因為該異常已經被捕獲。因為ArithmeticException 是Exception的子類,第一個catch語句將處理所有的面向Exception的錯誤,包括ArithmeticException。這意味著第二個catch語句永遠不會執行。為修改程序,顛倒兩個catch語句的次序
- Java自動化測試
- 第一章:Java:基礎內容
- 1.1:Java:Hello Word
- 1.2:Java:熱身
- 1.3:Java:注釋
- 1.4:Java:標識符
- 1.5:Java:常量
- 1.6:Java:基本數據類型
- 1.7:Java:引用類型
- 1.8:Java:String類
- 第二章:Java:運算符
- 2.1:Java:算數運算符
- 2.2:Java:關系運算符
- 2.3:Java:邏輯運算
- 2.4:Java:賦值運算符
- 2.5;Java:三元運算符
- 2.6:Java:位運算符
- 第三章:Java:循環控制語句
- 3.1:Java:for循環
- 3.2:Java:while循環
- 3.3:Java:switch
- 3.4:Java:if else
- 3.5:Java:練習題
- 第四章:Java:函數與全局/局部變量
- 4.1:Java:局部變量
- 4.2:Java:全局變量
- 第五章:Java:方法
- 5.1:Java:初識方法
- 5.2:Java:方法調用
- 5.3:Java:方法重載
- 5.4:Java:構造方法
- 5.5:Java:方法的注意事項
- 第六章:Java:面向對象
- 6.1:Java:小案例
- 6.2:Java:this 關鍵字
- 6.3:Java:super 關鍵字
- 6.4:Java:static 關鍵字
- 6.5:Java:final關鍵字
- 6.6:Java:instanceof 運算符
- 6.7:Java:面向對象之封裝
- 6.8:Java:面向對象之繼承
- 6.9:Java:面向對象之多態
- 第七章:Java:面向對象高級進階
- 7.1:Java:抽象類
- 7.2:Java:Java中String類
- 7.3:Java:interface接口
- 7.4:Java:ArrayList
- 7.5:Java:HashSet
- 7.6:Java:HashMap
- 7.7:Java:反射(reflection)
- 第八章:Java:日志以及異常捕獲
- 8.1:Java:log4j
- 8.2:Java:異常初識基礎
- 8.3:Java:未被捕獲的異常
- 8.4:Java:try和catch的使用
- 8.5:Java:多重catch語句的使用
- 8.6:Java:throws/throw 關鍵字
- 8.7:Java:finally關鍵字
- 8.8:Java:自定義異常
- 第九章:Java:xml and IO
- 9.1:Java:IO基本概念
- 9.2:java:properties
- 9.3:Java:xml基本介紹
- 9.4:Java:xml操作實例
- 第十章:Java:JDBC編程
- 10.1:Java:JDBC介紹
- 10.2:Java:JDBC查詢
- 10.3:Java:JDBC插入
- 10.4:Java:Batch
- 10.5:Java:JDBC連接池
- 第十一章:Java:TestNG
- 11.1:java:TestNG簡介
- 11.2:Java:TestNG小實例
- 11.3:Java:TestNG.xml文件配置
- 11.4:Java:TestNG基本注解
- 11.5:Java:TestNG注解代碼
- 11.6:Java:TestNG預期異常
- 11.7:Java:TestNG忽略測試
- 11.8:Java:TestNG超時測試
- 11.9:Java:TestNG分組測試