黑马程序员技术交流社区

标题: 关于子父类覆盖中异常的问题 [打印本页]

作者: 唐巍    时间: 2012-3-10 01:53
标题: 关于子父类覆盖中异常的问题
子类在覆盖父类时,为什么子类方法只能抛出父类方法的异常和该异常的子类?子类方法如果发生父类中没有的异常,该怎么处理?
作者: 彭卫红    时间: 2012-3-10 02:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: 乔玉吉    时间: 2012-3-10 02:18
本帖最后由 乔玉吉 于 2012-3-10 02:21 编辑

子类中如果发生父类没有的异常,只能try 不能抛 除非是运行时RuntimeException,这个不受父类约束

子类重写父类方法不能抛出比父类更宽的异常类型。其实理解这个很简单,
比如说宪法规定骂人只承担民事责任,到了刑法里就不能说直接枪毙了,这就是一个约束能力的问题,
子类行为不能超出父类约束范畴。否者就容易乱套。就像父类的某方法公有的,子类就不能重写改成私有的了。这就是一个约束力的问题。

简单的说就是 父类的异常包含了子类的
如果父类抛出的是Exception
那么子类随便什么异常就可以...因为任何异常都继承于Exception,不知你听懂了没?
作者: lucky_xingxing    时间: 2012-3-10 08:35
子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。
作者: 王杰    时间: 2012-3-10 09:51
子父类继承时,子类中的方法覆盖父类中的方法,如果父类中的方法抛出异常,那么子类中的方法要么抛出与父类一样的异常,或者该异常的子类,或者不抛!
这是为什么呢?试想一下,我们现在有两个类A和B,其中B继承A,A中有一个M方法抛出一个自定义的异常AECxception,AException继承Exception。B对A中的M方法进行覆盖,他抛出了一个Exception异常。
这样问题就来了。
如果在一个程序中,我们将A对象作为一个参数传入某函数中,并在函数中调用A的M方法,同时我们要对M方法进行try{ A.M(); }catch( AException e ){ e.printStackTrace(); } 的处理。
但是根据多态。我们可以把B对象也传入这个函数。这时候出问题了。如果我们传入的是B对象,那么他的异常将无法捕获。因为B的异常比A的异常大!
如果子类中产生了其他的异常。一般情况下,我们只能try不能抛。就是在子类中将问题解决了。
但是,如果子类中产生的是RuntimeException,我们可以抛出,并且不用在函数处声明。
作者: 刘豪杰    时间: 2012-3-10 10:33
在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异常。
综上所诉,子类重写父类的方法时候不能声明抛出比父类大的异常




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