A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

为什么 ?当子类覆盖父类方法是,只能比父类抛出更少的异常,
或者是抛出父类抛出的异常的子异常

13 个回复

正序浏览
楼主您好~帖子长时间未作出回答,我已经将您的帖子改成已解决。如果有问题的话可以私密我哦~
回复 使用道具 举报
子类只能抛出和父类异常相同或者父类异常的子类异常。如果抛出比父类更大的异常,父类根本就无法处理啊
回复 使用道具 举报
这个在老师视频中举例说明过原因,具体我记不太清楚了,把记得的稍微说下吧。
比如父类中有多个方法,其中有个方法A抛出异常,而方法B调用了A方法,并对A的异常进行了处理。
现在子类继承父类,并覆盖了A方法,但是没有覆盖B方法,假如子类在覆盖A时再抛出其他异常,
现在子类可以使用A方法和B方法,假设现在使用B方法,B方法会调用A方法,而A方法被覆盖,调用的就是被覆盖后的A方法,问题来了:
B方法对A方法抛出的异常会进行处理的,但是A被覆盖后,产生的新异常不属于父类中A抛出异常或其子类的话,B就处理不了,处理不了就会报错!!!!!
所以。。。。。。。。。。。。。
回复 使用道具 举报
还有点就是关于try-catch的,在排除异常的时候最好用对应的异常类,然后如果要有多个catch异常的话就要从小到大的去匹配异常,如果是从大到小的就会就有问题了
回复 使用道具 举报
夜默 金牌黑马 2013-6-14 11:19:44
9#
楼主你好,问题解决了没? 解决了就去修改成 “已解决”吧!
回复 使用道具 举报 1 0
楼主您好如果问题解决的话.请将问题及时改成已解决哦~谢谢您 的配合{:soso_e100:}
回复 使用道具 举报
      理解这个问题你首先要明白一点,在程序中除了RuntimeException和error之外,所有的异常都需要在程序方法上用throws
声明抛出或用try-catch捕获;
  像下面的程序:
  class  Fu{
    public void method()throws   IOException{
             ........}

class Zi extends FU{
public void method()throws   Exception{
            ..........}
}
在子类方法中声明抛出了比父类范围更大的异常;这在编译的时候显然就不会通过;
当子类抛出了不是IOException体系中异常时;系统就无法处理:

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
子类对父类实现继承,所以子类就只能抛出的异常少点。
回复 使用道具 举报
子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类是为了可以解决父类的一些问题,肯定不能比父类有更多的问题。
覆盖父类方法抛出的异常只能是以下情况(比如父类抛出IOEception异常):
1.要和父类方法抛出的异常一致,抛出IOEception异常
2.抛出的异常是父类抛出异常的子类,如EOFException异常
3.不抛出异常。
4.java.lang.RuntimeException异常或者其子孙类异常

在catch子句中心抛出一个比父类型更宽泛的异常。可以。

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 恩.很好很给力

查看全部评分

回复 使用道具 举报
父类已经具备比较全面的功能方法和异常,子类只是使用了父类的全部或者一部分功能,当子类覆盖父类方法时,要考虑父类的异常,子类异常比父类多的话,会报错,所以子类只能比父类抛出更少的异常。
回复 使用道具 举报
子类重写父类方法注意事项:
1,重写时方法的返回值类型、方法名、形参都不能变,即方法头不能变,重写的是方法体;
2,子类重写方法的访问权限不能比父类被重写方法更严格,即父类用的是public,子类就不能用private;
3,子类重写方法抛出的异常范围不能大于父类被重写方法的异常范围,即父类抛出IOException,子类就不能抛出Exception;
回复 使用道具 举报
我只知道:子类只能抛出父类里面的异常的子集,若是子类自己真有异常,只能内部try和catch,不能往外抛

但原因还真不知道
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马