异常处理-捕获多个异常无法正常工作

时间:2019-07-16 10:30:12

标签: java exception

我有一个具有多个异常的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不能正常工作...

2 个答案:

答案 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编译时间类型是ArithmeticExceptionNullPointerException的并集。因此,当编译器尝试将e的类型与Exce方法进行匹配时:

  • Exce(ArithmeticException)重载不适用,因为在运行时e可能是NullPointerException

  • Exce(Exception)重载是适用的,因为与eArithmeticException的并集匹配的NullPointerException的任何值也都是Exception

不幸的是,即使您愿意,也无法为ArithmeticException | NullPointerException声明方法重载。

  • 如果要像这样一起处理ArithmeticException | NullPointerException,则可以这样声明重载:

    public static void Exce(RuntimeException ex) {
        System.out.println("RuntimeException");
    }
    
  • 或者,分别捕获ArithmeticExceptionNullPointerException

  • 也可以在一个catch子句中捕获这两个异常,然后使用(例如)instanceof进行区分,并键入强制类型转换。但是要执行此操作需要更多代码。 (出于其他原因,这是个坏主意。)