-7

继承类中的覆盖方法必须

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

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

4

3 回答 3

1

被覆盖的方法不能抛出更新或更广泛的检查异常,因为当这个类的对象被多态引用时,调用者只能处理基类方法实现的契约中显示的异常。

被覆盖的方法可以抛出未经检查的异常,以防父方法抛出它。您甚至可以不在签名中声明它。但是如果父方法抛出检查异常,你只能在孩子中专门化这个异常(抛出相同的异常,它是后代或没有)。

请参阅此链接以获得更好的理解:http ://www.javatpoint.com/exception-handling-with-method-overriding

于 2013-11-12T09:25:32.510 回答
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不是运行时异常,所以如果堆栈中更高的方法不知道它,就不应该抛出它或者处理它)

于 2013-11-12T09:24:25.907 回答
0

这意味着如果你重写了一个抛出异常的方法,它只能抛出一个与超级方法抛出的异常相同的异常,或者是从超类扩展异常的异常(如果你愿意,抛出更少)。

于 2013-11-12T09:26:47.180 回答