Java:如何覆盖方法并抛出异常?

时间:2014-01-24 12:53:34

标签: java exception override

我试图覆盖一个方法,抛出异常:

class A {

    public doSomething(){
        // some of logic
    }

}


class B extends A {

    public doSomething() throws MyCustomizedException {
        try {
             // some of logic
        } catch(ExceptionX ex ) {
             throw new MyCustomizedException(" Some info ", ex);
        }
    }      
}

但是我得到了这个编译时错误:

Exception MyCustomizedException is not compatible with throws clause in A

这两个限制是:

  • 使用相同的函数名称和相同的参数(如果存在): doSomething()
  • 抛出我的自定义异常

如何摆脱异常?

非常感谢你。

4 个答案:

答案 0 :(得分:5)

无法完成。

覆盖方法时,不能破坏原始合同并决定抛出已检查的异常。

您可以取消选中MyCustomizedException。您可以抛出它,但不能要求用户以检查异常的方式处理它。您可以做的最好的事情是将其添加到javadoc并解释。

答案 1 :(得分:0)

这不是一个超载的情况。要重载,您需要具有相同签名但不同参数列表的方法。这是覆盖,如果A类可以修改,则在A类中使用public doSomething() throws MyCustomizedException {}

现在,您可以使用B类的当前实现覆盖。

答案 2 :(得分:0)

你能做到这一点的唯一方法是使你抛出的异常延伸RuntimeException而不是Exception。

这样你就可以抛出它,因为你不改变方法的紧凑,遗憾的是编译器不会自动检测到你需要捕获该异常,但取决于你如何使用它可能不是一个问题。

答案 3 :(得分:0)

实际上有一种方法可以做到这一点 - 使用组合而不是继承:

class B {
   A a = new A();
   void doSomething() throws MyException {
      a.doSomething();
      throw MyException();
   }
}

当然,通过执行此操作,您的B不再算作A,因此无法传递给期望A的任何内容。您可以在整个代码中使用B,然后根据需要打包。