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); }
上面的編譯時類型是和的并集。因此,當編譯器嘗試將 的類型與方法進行匹配時:e
ArithmeticException
NullPointerException
e
Exce
重載
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
和類型轉換來區分它們。但是要做到這一點需要更多的代碼。(由于其他原因,這是個壞主意。)
添加回答
舉報