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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁春龙 黑马帝   /  2011-7-19 17:29  /  2301 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

张老师说:“如果父类扔出多个异常,那么重写方法必须扔出那些已成的子集,也就意味着不能够扔出新的尔异常”我想问的是:这是否意味着我们要重写的这个方法的功能受到了一定的限制?

评分

参与人数 1技术分 +1 收起 理由
admin + 1 这问题只可意会,不可言传

查看全部评分

4 个回复

倒序浏览
黑马网友  发表于 2011-7-19 17:40:10
沙发
我觉得有新异常是可以的,但不能向外扔,因为外部不处理这些异常. 异常的原意也不是为了让抛的,而是处理的. 
所以应该不会有太大的影响
回复 使用道具 举报
黑马网友  发表于 2011-7-19 17:44:08
藤椅

回复 沙发 的帖子

我觉得按照你的解释就是:可以让新的功能部分产生任何新的异常,但需要注意的就是只能抛出和父类方法一样的异常,至于其他的异常也就必须在在里面处理掉,不向外抛就OK了?
回复 使用道具 举报
黑马网友  发表于 2011-7-20 16:29:50
板凳
关于这个问题,其实需要注意的。
在子类覆盖父类的方法时,子类方法抛出的异常必须和父类方法相同,或者子类方法抛出的异常是父类方法抛出的异常的子类。
例子:假如ExceptionSub1和ExceptionSub2是ExceptionBase的子类
[code=java]public class Base{
    void method throws ExceptionSub1{}
}
public class Sub1 extends Base{
    void method throws ExceptionBase{}//编译出错
}
public class Sub2 extends Base{
    void method throws ExceptionSub1,ExceptionSub2{}//编译出错
}[/code]
编译都通不过。这是什么原因?

这是因为,假如没有这个限制,那么便会与Java的多态机制冲突。
[code=java]Base base = new Sub2();//子类为父类实例化
try{
    base.method();
}catch(ExceptionSub1 e){//仅仅捕获ExceptionSub1
}[/code]
上面的代码编译器认为合法,因为ExceptionSub1是ExceptionBase的子类。但是,ase引用的实际上是Sub2的实例,运行时据多态机制,base.method();实际上调用子类的同名方法,假如Sub2的实例抛出ExceptionSub2异常,异常没有捕获,程序会异常终止。
所以,子类抛出的异常只能更少。

评分

参与人数 1技术分 +2 收起 理由
admin + 2 我都没从这个角度分析过,专业!!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-21 15:10:49
报纸

回复 楼主 的帖子

这几种情况要抛出异常:
           一:调用一个抛出已检查异常的方法
                System.out.println("x=" + x)
                或者
                Logger.global.info("x=" + x)
           二:在程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常
           三:程序出现错误
           四:Java虚拟机和运行时库出现的内部异常
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马