java - 多catch异常处理和多态性

标签 java exception try-catch

我有两种方法

process (MyExceptionType1 e){
...
}

process (MyExceptionType2 e){
...
}

和 try/catch :

try{

...

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

编译器拒绝调用 process(e),并出现以下错误: 没有找到适合 processException(java.lang.Exception) 的方法

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

但它接受

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

如何解释这种行为?

感谢您的帮助。

纳德

最佳答案

这是不允许的,因为在编译时,(MyExceptionType1 | MyExceptionType2 e) 中变量 e 的类型是 最具体的常见父类(super class)型>MyExceptionType1MyExceptionType2

无论 MyExceptionType1MyExceptionType2 的常见父类(super class)型是什么,它对于仅 MyExceptionType1 或仅 MyExceptionType2 来说都太宽泛了作为方法的参数。这解释了为什么它适用于单个 catch block 。

如果这两个类没有扩展不同的异常类,那么这两个类的公共(public)父类(super class)可能是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);
}

关于java - 多catch异常处理和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50350863/

相关文章:

java - DatabaseMetaData#g​​etFunctionColumns 的 functionColumnReturn 常量?

scala - 捕获 Scala 2.8 RC1 中的所有异常

javascript - Try/Catch 不会捕获声明的常量错误

F#:我可以在调用基类的构造函数中使用 try/with 吗?

java - 是否指定异常?

java - Androidplot 线不显示

java - 是否有某种运行 ID 对于单个 "run"中的所有功能都相同?

java - 浏览器下载完成事件

Android 在键盘插入时崩溃

c# - 为什么目录上的 File.Delete() 会产生 UnauthorizedAccessException?