2 回答
TA貢獻1909條經驗 獲得超7個贊
如果將 ArithmeticException 和 NullPointerException 拆分為 2 個 catch 塊,它會按預期工作。我假設這是因為變量 e 被聲明為 Exception 類型,以便能夠容納 ArithmeticException 和 NullPointerException。
public static void main(String[] args) {
try {
int a = 10 / 0;
} catch (ArithmeticException e) {
Exce(e);
} catch (NullPointerException e) {
Exce(e);
} catch (Exception e) {
Exce(e);
}
}
TA貢獻1911條經驗 獲得超7個贊
} catch (ArithmeticException | NullPointerException e) {
Exce(e);
}上面的編譯時類型是和的并集。因此,當編譯器嘗試將 的類型與方法進行匹配時:eArithmeticExceptionNullPointerExceptioneExce
重載
Exce(ArithmeticException)不適用,因為在運行時e可能是一個NullPointerException.重載
Exce(Exception)是適用的,因為e匹配的聯合的任何值ArithmeticException也是NullPointerException一個Exception。
不幸的是,您不能為 ... 聲明方法重載,ArithmeticException | NullPointerException即使您想要:
如果你想像
ArithmeticException | NullPointerException這樣一起處理,你可以像這樣聲明一個重載:public static void Exce(RuntimeException ex) { System.out.println("RuntimeException"); }或者,分別捕獲
ArithmeticException和NullPointerException。也可以在一個 catch 子句中捕獲這兩個異常,然后使用(比如說)
instanceof和類型轉換來區分它們。但是要做到這一點需要更多的代碼。(由于其他原因,這是個壞主意。)
添加回答
舉報
