【问题标题】:multi catch exception processing and polymorphisme多捕获异常处理和多态性
【发布时间】:2018-05-15 12:58:58
【问题描述】:

我有两种方法

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);
}

如何解释这种行为?

感谢您的帮助。

纳德

【问题讨论】:

  • 您的进程将异常作为输入?澄清一下怎么样?
  • 您使用的是哪个 JAVA 版本? JAVA 7 之前的版本不支持多个 Catch 块。
  • 您还显示了processExceptionprocess - 第一种方法在哪里?投票结束时不清楚,除非你当然做得更好
  • 您的process 方法都不接受两种 类型的异常,因此在编译期间这两种方法都不能用于解析process(e) 调用。
  • 当使用多捕获块时,捕获块中的异常类型始终是捕获的异常的常见类型。对于 Java 提供的基本异常,这通常是 RuntimeExceptionException。你会不会例如创建一个派生自RuntimeException 的类MyException 和派生自MyException 的两个类MyException1MyException2,并制作一个多捕获捕获MyException1MyException2,捕获块中的异常类型将属于MyException。在您的情况下,这两个异常的基类是Exception

标签: java exception try-catch


【解决方案1】:

这是不允许的,因为在编译时,(MyExceptionType1 | MyExceptionType2 e) 中的变量e 的类型是MyExceptionType1MyExceptionType2 最特定的常见超类型。

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

如果这两个类没有扩展不同的异常类,那么这两个类的共同超类很可能是Exception。因此,您可能需要检查异常对象的实例(也就是说,如果您不想使用 multi-catch):

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);
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-07
      • 2017-05-08
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2015-10-02
      • 1970-01-01
      • 2011-09-14
      相关资源
      最近更新 更多