覆盖方法中的例外情况

时间:2013-11-12 09:20:51

标签: java exception exception-handling

继承类中的重写方法必须

  

抛出更少或更窄的异常但不比被覆盖的方法更广泛的例外。

我可以知道这条规则背后的意图吗?

3 个答案:

答案 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方法抛出的异常,或者是一个从超类扩展异常的异常(抛出更少的异常)你会)。