黑马程序员技术交流社区

标题: 问题已经解决异常在子父类覆盖中抛出以上疑问 [打印本页]

作者: 郑彬    时间: 2012-8-15 14:31
标题: 问题已经解决异常在子父类覆盖中抛出以上疑问
本帖最后由 郑彬 于 2012-8-15 22:43 编辑

异常在子父类覆盖中的体现:
1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常类的子类。
2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
3,如果父类或接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
        如果子类方法发生了异常。就必须要进行try处理。绝对不能抛。
以上3点如何解释,为什么?
作者: 朱志辉    时间: 2012-8-15 16:10
子类要比父类更强大,extends,扩展的意思。
如果子类抛出更多的异常,表示子类变弱了!所以子类不能抛出比父类更多的异常。
怎样比较强大与弱小,要求异常具有可比性。所以子类只能抛出父类抛出的异常的子集。

作者: 程有愿    时间: 2012-8-15 17:13
你可以从你说的第一条和第二条看出一个规则,子类必须比父类更优化,也就像生物进化一样,子类出现的问题不能比父类多就是,既然父类都没有出现异常,那么子类更不能出现异常了,所以只能try{}catch(){}进行处理了!
作者: 李知伦    时间: 2012-8-15 17:49
强大不能解决问题啊.....不能说java就么规定的.....
比如
java有一个异常IOException是Excepion的子类
java还有一个父类是Father throws IOException,并且有一个test()方法
java还有Father的一个子类son 如果他无限制,throws Exception,同时重写test()方法
另一个A类:
Father f=new Father();
void app(f){
    try{f.test()}catch(IOExcption){}
}

当用A类时,传入一个子类对象
Son s=new Son();
A.app(s)就会出错,抓不住Exception


作者: 张忠豹    时间: 2012-8-15 18:37
本帖最后由 张忠豹 于 2012-8-15 18:47 编辑

1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常类的子类。
    只能抛出父类方法的异常,这个是理所当然的。为什么还能抛出子类方法的异常,这是将问题细化,得到更好的处理
比如:
try{
throw new NullPointerException();
//下面用Exception捕获是不会出问题的吧,但是你要是用catch(NullPointerException e){}来捕获的话,是不是更好一些!
}catch(Exception e){

}
2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
   因为在子类覆盖的方法中可以用try{}catch(){}语句进行处理,处理之后这个异常就不存在了,所以就只能抛出子集了(子集是包括其自身的)
3,如果父类或接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常
  函数覆盖,讲究的就是函数的声明部分都要相同(访问权限只能上升),返回值类型、方法名称、参数顺序和类型都要保持一致。父类没有声明异常,子类当然不该有
作者: 郑彬    时间: 2012-8-15 22:43
问题已经解决




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