为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

青春有我 2023-03-31 09:39:18
我有一个包含多个异常的 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");}但是我得到的输出是“异常”。我不确定为什么没有显示算术当我有单独的算术和空指针的捕获块时..我能够打印“算术”..但是捕获多个异常不起作用......
查看完整描述

2 回答

?
jeck猫

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);

    }

}


查看完整回答
反对 回复 2023-03-31
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

} 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");
    }
  • 或者,分别捕获ArithmeticExceptionNullPointerException

  • 也可以在一个 catch 子句中捕获这两个异常,然后使用(比如说)instanceof和类型转换来区分它们。但是要做到这一点需要更多的代码。(由于其他原因,这是个坏主意。)


查看完整回答
反对 回复 2023-03-31
  • 2 回答
  • 0 关注
  • 108 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信