异常处理 - 捕获多个异常未按预期工作

我有一个包含多个异常的 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");

}

但是我得到的输出是“异常”。我不确定为什么没有显示算术


当我有单独的算术和空指针的捕获块时..我能够打印“算术”..但是捕获多个异常不起作用......


青春有我
浏览 109回答 2
2回答

jeck猫

如果将 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);    }}

Smart猫小萌

} 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和类型转换来区分它们。但是要做到这一点需要更多的代码。(由于其他原因,这是个坏主意。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java