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
和类型转换来区分它们。但是要做到这一点需要更多的代码。(由于其他原因,这是个坏主意。)
添加回答
举报