黑马程序员技术交流社区

标题: 异常在子父类覆盖时的原则理解方面问题。 [打印本页]

作者: 付信榕    时间: 2012-5-18 15:47
标题: 异常在子父类覆盖时的原则理解方面问题。
子父类覆盖时的原则:子类不能抛出比父类更多的异常。
看毕老师的视频时理解得比较浅,现在复习时又不记得为什么是这个原则了。求更好的理解
作者: 张文建    时间: 2012-5-18 16:06
异常的注意事项:
        在子父类覆盖时:
        1,子类抛出的异常必须是父类的异常的子类或者子集。
        2,如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能try不能抛。

在java 中,当我们子类要重写父类中的方法,如果父类的方法有异常声明,那么子类重写这个方法时候,所要声明的异常不应该比父类的大。只能是小等,或者可以没有。原因如下。
假如我们自定义一个异常:
public class MyException extends Exception {
public MyException(String message) { //有参

}
public MyException() { //空参

}
}

那么我们有一个父类它将有一个方法,将声明抛出这个异常。我们把它做成抽象的(无所谓)
public abstract class ParentException {
public abstract void test() throws MyException;
}
那么将有一个类使用到上面这个类
public class ExceptionTest {
private ParentException exception;
public ExceptionTest(ParentException exception){
this.exception=exception;
}
public void app(){
try {
exception.test();
} catch (MyException e) {
e.printStackTrace();
}
}
}
对于以上的try~catch 我们就直接捕获MyException异常。这是正确的,它在编译的时候是没有问题的。
假如,有一个ParentException的有一个子类
public class ChildException extends ParentException{
public void test() throws Exception{

}
}
他的方法可以声明抛出比父类大的异常,假如它是正确的。
那么问题来了。当我们执行ExceptionTest类的时候,我们以这个子类做为对象传进去。
exception.test();这个地方将在运行的时候实际调用的是ChildException这个子类的test()方法,而它的声明抛 出却是比父类大的异常,这就使得在ExceptionTest类中,捕获异常处出现了毛病,因为它无法捕获Exception异常。
综上所诉,子类重写父类的方法时候不能声明抛出比父类大的异常
作者: 宗士为    时间: 2012-5-18 16:08
这个就是这样设计的记住就好了   
举个现实的例子:我们现在有个动物类,它有个方法叫  eat() ,吃东西会抛出被毒死的异常,这是吃东西唯一可能出现的异常情况!  那么我们的子类在重写eat()方法时可以抛出  毒死异常或其子类,如"误把老鼠药当食物被毒死异常”、"吃有毒蘑菇被毒死异常“.....

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

这样应该可以明白吧
作者: 李文富    时间: 2012-5-18 16:23
本帖最后由 李文富 于 2012-5-18 16:25 编辑

我觉得这个问题应该是子类方法覆盖父类方法时不能抛出比父类更大的异常而不是更多。
因为如果父类方法抛出异常,那么它的子类应抛出该异常,或者该异常的子类也可以不抛,
如果该异常是子类特有的那么就得使用try{}catch{}语句处理,子类的方法受到父类方法的约束,
试想一下当你的子类throws 出去的异常比父类的异常还要大当在多态的时候,子类对象可以替代
父类对象所出现的地方,那么当子类方法异常发生了而且不在父类异常管辖范围,父类异常则没有
捕获它能力所以,这样做是不可取的。
作者: 信义明    时间: 2012-5-18 17:11
简单来理解就是,子类是为了方便继承了父类并重写父类的方法,而不能因此制造出更多的问题(即异常),这样使用继承就变得麻烦了,因此,子类不能抛出父类没有抛出的异常,希望能便于你理解{:soso_e113:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2