多捕获异常处理和多态性

时间:2018-05-15 12:58:58

标签: java exception try-catch

我有2个方法

process (MyExceptionType1 e){
...
}

process (MyExceptionType2 e){
...
}

和try / catch:

try{

...

}catch (MyExceptionType1 | MyExceptionType2 e){
process(e);
}

编译器拒绝调用进程(e)时出现此错误: 没有为processException找到合适的方法(java.lang.Exception)

就好像忽略了catch子句中给出的类型一样。

但接受

}catch (MyExceptionType1 e){
process(e);
}catch(MyExceptionType2 e){
process(e);
}

如何解释这种行为?

感谢您的帮助。

纳德

2 个答案:

答案 0 :(得分:2)

这是不允许的,因为在编译时,e中变量(MyExceptionType1 | MyExceptionType2 e)的类型是MyExceptionType1MyExceptionType2中最具体的常见超类型。< / p>

无论MyExceptionType1MyExceptionType2的常见超类型是什么,它对于MyExceptionType1或仅仅MyExceptionType2来说都太广泛了作为方法的参数。这解释了为什么它适用于单个捕获块。

如果这两个类没有扩展不同的异常类,那么这两个类的公共超类很可能是Exception。因此,您可能需要检查异常对象的实例(即,如果您不想使用多重捕获):

process (Exception e){ //If the exceptions extend a common specific type, use it here
    if(e instanceof MyExceptionType1)
       process((MyExceptionType1) e);
    else if (e instanceof MyExceptionType2)
       process((MyExceptionType2) e);
}

答案 1 :(得分:0)

您可以检查异常类型,然后重定向到所需的方法。

catch(Exception1 | Exception2 e){
            if(e instanceof Exception1)
                m1((Exception1)e);
            if(e instanceof Exception2)
                m1((Exception2)e);
        }