我有两种方法
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)型>MyExceptionType1
和 MyExceptionType2
。
无论 MyExceptionType1
和 MyExceptionType2
的常见父类(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/