java中覆盖方法带有抛出异常的情况

来源:百度知道 编辑:UC知道 时间:2024/06/03 05:39:37
书上说子类覆盖父类方法抛出异常不能比父类多,
这个多是说数量的多,还是异常种类上的多?
就是说父类方法抛的异常是Error,子类抛的是Exception,就是错的,是这样吗?是说子类抛出的异常必须从属于父类抛出的异常吗?

子类覆盖父类方法抛出异常不能比父类多 这句话表述有些问题

正确应该是子类抛出的异常类型不能比父类抛出的异常类型更宽泛

通俗一点讲就是:子类的异常类型不能比父类的异常类型更大或更多
例如父类方法抛出一个FileNotFoundException,这时候子类可以抛出FileNotException或者其子类,例如我自己写了File1Exception,File2Exception,他们都继承自FileNotException,这时候子类可以同时抛出File1Exception和File2Exception,因为他们都是FileNotFoundException,满足“子类抛出的异常类型不能比父类抛出的异常类型更宽泛”这个条件 同时子类还可以抛出RuntimeExceptioin这是运行时异常,不受上面条件的约束!

为什么设计成这样呢? 举个现实的例子:我们现在有个动物类,它有个方法叫 eat() ,吃东西会抛出被毒死的异常,这是吃东西唯一可能出现的异常情况! 那么我们的子类在重写eat()方法时可以抛出 毒死异常或其子类,如"误把老鼠药当食物被毒死异常”、"吃有毒蘑菇被毒死异常“.....

但是子类就是不能抛出毒死异常之外的 如”撑死异常“或者”噎死异常“,因为父类是个大前提,指所有动物,animal总共才抛出毒死异常这个类型,你子类就不能抛出我类型之外的状况!
例子举的不太好,但是可以帮助理解。

父类的异常要包括子类的异常,
子类不能比父类多的意思是,子类的异常要在父类异常的包括范围之内。
子类抛Exception,父类必须要有相应的处理,同时父类再抛出error就是对的。
子类抛出的异常必须从属于父类抛出的异常,这种说法我不认同。
我认为子类抛出的异常在父类必须有相应的处理,否则必须从属于父类抛出的异常。

写在前面:将父类异常看成是其所有子类的集合
在这个前提下 无论是种类还是数量,子类覆盖父类方法抛出异常不能比父类多(即小于等于)


父类方法 throws Exception
子类方法 throw