我试图覆盖一个方法,抛出异常:
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
这两个限制是:
如何摆脱异常?
非常感谢你。
答案 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,然后根据需要打包。