我有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);
}
如何解释这种行为?
感谢您的帮助。
纳德
答案 0 :(得分:2)
这是不允许的,因为在编译时,e
中变量(MyExceptionType1 | MyExceptionType2 e)
的类型是MyExceptionType1
和MyExceptionType2
中最具体的常见超类型。< / p>
无论MyExceptionType1
和MyExceptionType2
的常见超类型是什么,它对于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);
}