2 回答

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個(gè)贊
如果將 ArithmeticException 和 NullPointerException 拆分為 2 個(gè) catch 塊,它會(huì)按預(yù)期工作。我假設(shè)這是因?yàn)樽兞?e 被聲明為 Exception 類(lèi)型,以便能夠容納 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貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
} catch (ArithmeticException | NullPointerException e) { Exce(e); }
上面的編譯時(shí)類(lèi)型是和的并集。因此,當(dāng)編譯器嘗試將 的類(lèi)型與方法進(jìn)行匹配時(shí):e
ArithmeticException
NullPointerException
e
Exce
重載
Exce(ArithmeticException)
不適用,因?yàn)樵谶\(yùn)行時(shí)e
可能是一個(gè)NullPointerException
.重載
Exce(Exception)
是適用的,因?yàn)?code>e匹配的聯(lián)合的任何值ArithmeticException
也是NullPointerException
一個(gè)Exception
。
不幸的是,您不能為 ... 聲明方法重載,ArithmeticException | NullPointerException
即使您想要:
如果你想像
ArithmeticException | NullPointerException
這樣一起處理,你可以像這樣聲明一個(gè)重載:public static void Exce(RuntimeException ex) { System.out.println("RuntimeException"); }
或者,分別捕獲
ArithmeticException
和NullPointerException
。也可以在一個(gè) catch 子句中捕獲這兩個(gè)異常,然后使用(比如說(shuō))
instanceof
和類(lèi)型轉(zhuǎn)換來(lái)區(qū)分它們。但是要做到這一點(diǎn)需要更多的代碼。(由于其他原因,這是個(gè)壞主意。)
添加回答
舉報(bào)