我有一个具有多个异常的catch块-Arithmetic和NullPointer和一个具有Exception的catch块。我正在从catch块中调用方法,但是找不到正确的异常实例。
try {
int a = 10/0;
} catch (ArithmeticException | NullPointerException e) {
Exce(e);
} catch (Exception e) {
Exce(e);
}
public static void Exce(ArithmeticException ex) {
System.out.println("Arithmetic");
}
public static void Exce(Exception ex) {
System.out.println("Exception");
}
但是我将输出显示为“ Exception”。.我不确定为什么算术未显示
当我对算术和Null指针使用单独的catch块时。我能够打印“算术”。但是具有多个异常的catch不能正常工作...
答案 0 :(得分:3)
如果将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);
}
}
答案 1 :(得分:1)
} 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
进行区分,并键入强制类型转换。但是要执行此操作需要更多代码。 (出于其他原因,这是个坏主意。)