Java catch多重異常捕獲
摘要:Java中多重異常捕獲機制可以更加簡潔、有效地處理多個異常,提高了程序的魯棒性,是編寫高質量代碼的重要技巧之一。
??小編在《淺談Java異常處理機制》中梳理了異常處理機制,在《Java 異常處理try、catch、finally和return執行順序》中介紹了異常處理時,try、catch、finally和return的執行順序,本文介紹如何使用catch捕獲多個異常。
??當我們編寫代碼時,經常會遇到異常,如文件不存在、空指針、數組下標越界等等異常。因為異常的發生可能會導致程序崩潰,因此需要對異常進行捕獲和處理。對異常處理有三個核心關鍵字:try、catch、finally,常用使用方法如下:
try {
//有可能出現異常的語句
} catch (異常類型A 對象) {
//異常處理methodA
} catch (異常類型B 對象) {
//異常處理methodB
} finally {
//不管有沒有出現異常,這里的代碼都會執行
}
??我們在try語句中捕獲可能出現異常的代碼。如果try捕獲到異常,則會與和它匹配的catch中的異常類型依次進行比對,如果相同則進行處理;如果不匹配,則繼續匹配后續的catch類型;如果都不匹配,那么表示該異常無法由catch塊處理,需要采用JVM默認的異常處理方式進行處理。最后不管有沒有異常,都會執行finally中的語句塊。溫馨提示:finally語句塊可以省略,如果省略,則在執行完catch語句塊之后,程序繼續執行后邊的代碼。
??Java提供的 catch 代碼塊雖然客觀上提高了程序的健壯性,但是也導致了程序代碼量大大增加。如果有些異常種類不同,但捕獲之后的處理邏輯是相同的,例如把methodB換成了methodA,則可以使用如下多重異常捕獲技術:
try {
//有可能出現異常的語句
} catch (異常類型A | 異常類型B 對象) {
//異常處理methodA
} finally {
//不管有沒有出現異常,這里的代碼都會執行
}
??什么是多重異常捕獲?就是在同一個catch語句塊中捕獲多種不同的異常,多個異常類型之間使用管道符|隔開。
??使用多重異常捕獲時,如下幾點需要各位老鐵注意:
- 多種異常類型之間用管道符
|隔開。 - 捕獲多種類型的異常時,異常變量被隱式的 final 修飾,因此不能對異常變量重新賦值。
- 在捕捉異常時,請記錄異常信息,以便定位問題。
- 多個異常類型必須是從小到大排列,即父類異常必須放在子類異常之后,這是因為Java會優先匹配catch語句的第一個參數。
- 盡可能使用特定的異常類型來捕獲異常。這可以幫助你更準確地識別問題,并采取適當的措施。例如,如果你正在處理文件讀取錯誤,則可以捕獲FileNotFoundException異常。
- 避免捕獲所有異常。這可能會掩蓋真正的問題,并使調試變得更加困難。相反,只捕獲你預計可能會出現的異常。
??下面程序示范了多異常捕獲。
public class ExceptionTest {
public static void main(String[] args) {
try {
int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
int c = a / b;
System.out.println("您輸入的兩個數相除的結果是:" + c);
} catch (IndexOutOfBoundsException | NumberFormatException | ArithmeticException finalExc) {
System.out.println("發生了數組越界、數字格式異常、算術異常之一");
// 捕獲多異常時,異常變量默認有final修飾,故下面的代碼有錯:
// finalExc = new ArithmeticException("test");
} catch (Exception e) {
System.out.println("未知異常");
// 捕獲一種類型的異常時,異常變量沒有final修飾,所以下面代碼完全正確
e = new RuntimeException("test");
}
}
}
??上面程序中第一個catch塊使用了IndexOutOfBoundsException|NumberFormatException|ArithmeticException來定義需要攔截的異常類型,它表明該 catch 塊可以同時捕獲這 3 種類型的異常。捕獲多種類型的異常時,異常變量使用隱式的 final 修飾,因此如果去掉finalExc = new ArithmeticException("test"); 前面的注釋,代碼將產生編譯錯誤,提示Cannot assign a value to final variable 'finalExc';但是,捕獲一種類型的異常時,異常變量沒有被final關鍵詞修飾,因此e = new RuntimeException("test")可以編譯通過。
??由于NumberFormatException是Exception的子類,所以,把Exception放在了NumberFormatException后面;否則,后者起不到作用。
Buy me a coffee. ?Get red packets.
浙公網安備 33010602011771號