继承类中的重写方法必须
抛出更少或更窄的异常但不比被覆盖的方法更广泛的例外。
我可以知道这条规则背后的意图吗?
答案 0 :(得分:1)
重写的方法不能抛出更新或更广泛的检查异常,因为当这个类的对象被多态地引用时,调用者只能通过基类方法实现处理合同中显示的异常。
重写方法可以抛出未经检查的异常,以防父方法是否抛出它。你甚至不能在签名中声明它。 但是如果父方法抛出已检查的异常,则只能在子代中专门化此异常(抛出相同的异常,它是后代或无)。
请参阅此链接以便更好地理解:http://www.javatpoint.com/exception-handling-with-method-overriding
答案 1 :(得分:0)
Child类必须能够像父类一样运行;当调用抛出的父类方法(例如)IOExceptions
时,你不希望突然收到OtherException
。
例如
public class ParentClass {
public void doSomething() throws IOException{
}
}
public class ChildClass extends ParentClass{
@Override
public void doSomething() throws IOException, CustomException{
super.doSomething();
}
}
当我们使用父类调用doSomething()时,我们有义务处理IO异常
public static void main(String[] args){
ParentClass p=new ChildClass(); //child class behaving as parent
try {
p.doSomething();
} catch (IOException ex) {
Logger.getLogger(ChildClass.class.getName()).log(Level.SEVERE, null, ex);
}//no catch for secret CustomException that the ChildClass can throw
}
但是你可以看到有一个秘密的CustomException
可能被抛出而我们还没有处理过(但由于CustomException
不是运行时异常它不应该'如果没有堆栈中更高的方法知道它或处理它就可能抛出它)
答案 2 :(得分:0)
这意味着如果你重写了抛出异常的方法,它只会抛出一个与super方法抛出的异常,或者是一个从超类扩展异常的异常(抛出更少的异常)你会)。