黑马程序员技术交流社区

标题: 关于异常 [打印本页]

作者: 袁春龙    时间: 2011-7-19 17:29
标题: 关于异常
张老师说:“如果父类扔出多个异常,那么重写方法必须扔出那些已成的子集,也就意味着不能够扔出新的尔异常”我想问的是:这是否意味着我们要重写的这个方法的功能受到了一定的限制?
作者: 匿名    时间: 2011-7-19 17:40
我觉得有新异常是可以的,但不能向外扔,因为外部不处理这些异常. 异常的原意也不是为了让抛的,而是处理的. 
所以应该不会有太大的影响
作者: 匿名    时间: 2011-7-19 17:44
标题: 回复 沙发 的帖子
我觉得按照你的解释就是:可以让新的功能部分产生任何新的异常,但需要注意的就是只能抛出和父类方法一样的异常,至于其他的异常也就必须在在里面处理掉,不向外抛就OK了?
作者: 匿名    时间: 2011-7-20 16:29
关于这个问题,其实需要注意的。
在子类覆盖父类的方法时,子类方法抛出的异常必须和父类方法相同,或者子类方法抛出的异常是父类方法抛出的异常的子类。
例子:假如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异常,异常没有捕获,程序会异常终止。
所以,子类抛出的异常只能更少。
作者: 匿名    时间: 2011-7-21 15:10
标题: 回复 楼主 的帖子
这几种情况要抛出异常:
           一:调用一个抛出已检查异常的方法
                System.out.println("x=" + x)
                或者
                Logger.global.info("x=" + x)
           二:在程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常
           三:程序出现错误
           四:Java虚拟机和运行时库出现的内部异常




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