黑马程序员技术交流社区

标题: 子类中抛出了父类没有的异常,编译是否会失败? [打印本页]

作者: 乔玉吉    时间: 2012-3-11 01:32
标题: 子类中抛出了父类没有的异常,编译是否会失败?
class SuperClass
{

        public void mb_method()
        {
       
        }

}

public class Test2 extends SuperClass
{

        public void mb_method(int i)throws Exception
        {
       
        }
        public static void main(String args[])
        {
                System.out.println("Hello World!");
        }

}


作者: 刘豪杰    时间: 2012-3-11 02:32
java当子类的方法覆盖了父类的方法时,子类方法的抛出的异常 不能多于 父类方法中声明的异常,否则会产生编译错误。此时,我们可以自定义异常,使之继承Exception,来对子类出现的异常进行处理。
作者: 付鹏    时间: 2012-3-11 02:37
子类要重写父类中的方法,如果父类的方法有异常声明,那么子类重写这个方法时候,所要声明的异常不应该比父类的大。只能是小于或者等于。根据这个定义 子类抛出父类没有的异常应该会编译失败 但是你定义的是空方法 那就不一定了
作者: 王杰    时间: 2012-3-11 09:23
本帖最后由 王杰 于 2012-3-11 09:25 编辑

如果子类中显示的抛出了父类没有或者大于父类的异常。编译会失败。
但是如果你的子类中抛出的是RuntimeException,那么编译是可以通过的,但是运行就会出问题。
试想一下,我们现在有两个类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,我们可以抛出,并且不用在函数处声明。
作者: lucky_xingxing    时间: 2012-3-11 09:35
这是肯定的,子类可以解决比父类更多的问题,但是不能比父类抛出更多的问题,




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