黑马程序员技术交流社区

标题: 异常在子父母异常的体现-----子类不能处理新的异常 [打印本页]

作者: 曹强    时间: 2014-4-6 17:55
标题: 异常在子父母异常的体现-----子类不能处理新的异常
毕老师在视频中讲述:1、子类在覆盖父类时,如果父类的放大抛出异常,那么子类的的覆盖方法只能抛出父类的异常或者该异常的子类                         2、如果父类方法抛出对个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集
      然后就把我搞糊涂了,首先,子类和子集的意思是两个相反的概念,子集在数学里的概念是 被包含的意思,而子类在java里的概念是子类包含父类,也就是说父类是子类的子集(有点偏差,但是这是大概的意思),那么毕老师在视频中写的可能写错了,不知道那个正确。
      然后就是还有句话,子类不能处理新的异常。子类继承父类,同时拥有自己独特的方法啥的,那么子类抛出父类的异常可以理解,但是为什么不能处理新的异常啊,他会有自己独特的方法,也可能会出现异常啊
      以上 我的疑问,不太懂,求大神指导(ps:小菜鸡一个,有不对的地方不要打脸^v^)
作者: zzmxhm    时间: 2014-4-6 18:03
这个指的是子类覆盖父类方法时,子类中方法抛出的异常必须是父类中被覆盖方法抛出的异常的子类。因为多态,我们可以用父类引用指代子类对象,如果子类中的方法(覆盖了父类中的方法)可以抛出父类相应方法未声明或“包含”的异常,运行时就会出现已检查异常未被捕获的现象。
作者: 曹强    时间: 2014-4-6 18:16
哦,好吧,我自己好好咀嚼下
作者: 张治国    时间: 2014-4-6 18:34

这就是java的重写规则。
对于异常重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。
子类的特有方法,如果出异常了,当然要抛出新的异常啊。
毕老师只是说在覆盖方法的时候!有可能你理解错了吧!
作者: 黄泉    时间: 2014-4-6 18:39
在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异常。
综上所诉,子类重写父类的方法时候不能声明抛出比父类大的异常,同时因为RuntimeException可以不处理,所以这类异常可以除外。




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