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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李建锋 黑马帝   /  2011-12-7 00:18  /  2163 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李建锋 于 2011-12-8 14:58 编辑

当一个方法被覆盖是,覆盖它的方法为什么必须抛出他的异常或其子类!

评分

参与人数 1技术分 +1 收起 理由
admin + 1 去看下老罗的这个帖子:请注意:不要在QQ群.

查看全部评分

5 个回复

倒序浏览
本帖最后由 刘海涛 于 2011-12-7 10:14 编辑

这是java中的一种规定,也是避免程序员犯错,在论坛有帖。这里面写得很清楚了。
地址:http://bbs.itheima.com/forum.php ... amp;page=1#pid24731

评分

参与人数 1技术分 +1 收起 理由
admin + 1 赞一个!

查看全部评分

回复 使用道具 举报
假设A extends Exception   , C extends Exception ,  B exception  A

如果父类的函数中有个A异常 , 那么子类必须要么抛A要么抛B,不能抛C
我们假设可以抛C  
比如有个Test类有个方法需要传进来一个父类对象当参数,要调用父类的一个方法,父类的方法有异常,那么这个Test类也许会catch(A   a)一下,
但如果你要传进来一个子类,根据多态,也可以调用相应方法,但执行的是子类的方法,这时候你抛出一个C
那么catch接收不了 程序就报错了
明白了吗

所以 如果子类真的有超过父类异常的范围 只能自己在内部try  catch解决了   不能抛了

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
class Exception1 extends Exception{}
class Exception11 extends Exception1{}
class Exception2 extends Exception{}
class Fu
{
        void show()throws Exception1
        {}
        public void run(Fu f)
        {
                try
                {
                        f.show();//当传入子类对象的引用时,运行时调用的是子类中的show方法,
                                //子类抛出了Exception2异常,这时下面的catch无法捕获该异常。这就出现了问题,导致旧代码(父类的方法)无法再使用。       
                }
                catch(Exception1 e)//这里只能捕获Exception1、 Exception11
                {}       
        }
}
class Zi extends Fu
{
        void show()throws Exception2//错误,编译无法通过。java不允许这样做。
        {}       
}
class Demo4
{
        public static void main(String[] args)
        {
                Fu f=new Fu();
                f.run(new Zi());
         }
}
Fu类是旧代码,为了扩展功能、优化代码等操作,添加了Zi类,旧代码是不能改动。
Zi类show方法覆盖了父类中的方法,并抛出了父类不能捕获的异常。这导致旧代码不能使用。
为了避免这种错误,java中规定子类覆盖父类方法时,只能抛出父类被覆盖方法抛出的异常或其子异常。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
admin 程序媛 2011-12-8 11:19:05
报纸
黑马论坛导航栏下面有个搜索,提问时大家可以先搜索下!
回复 使用道具 举报
楼上讲的非常精彩!兄弟受益匪浅·!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马