黑马程序员技术交流社区

标题: 父类方法没抛出异常,子类方法可以抛出异常? [打印本页]

作者: 354620815    时间: 2014-10-12 21:48
标题: 父类方法没抛出异常,子类方法可以抛出异常?
在JAVA中子类覆盖父类方法时,可以不抛出异常,如果抛出异常,只能抛出父类异常的子类。。。如果父类没有抛出异常子类也不能抛出异常。。。
我想这个大家都知道。。。运行是异常RuntimeException是异常?肯定是的,因为RuntimeException继承了Exception。。。接下来就很纠结了。。。
Object的equals(),方法是不抛出异常的:        public boolean equals(Object obj)   但是:覆盖了Object的equals()方法,却可以抛出运行时异常
  1. public class Test1{
  2.        
  3.         public boolean equals(Object obj) throws RuntimeException{ //覆盖了Object的equals()方法               
  4.                 throw new RuntimeException();//结果:抛出运行时异常编译却能通过               
  5.         }               
  6. }
复制代码
这是为什么?




作者: liaorubei    时间: 2014-10-12 22:00
说一个不太确定的答案吧,
第一,异常处理在子类重写父类方法时,如果父类要抛出异常,那么子类也只能抛出异常,而不能处理异常,
当父类没有抛出异常时,子类抛不抛异常应该是看子类需要不需要抛来看的,如IO流一样,有些子类的方法实现里面没有涉及到资源,那当然不用抛异常了,有时子类的方法实现里面有资源的引用,那么就要抛出异常了,所以应该是看子类需要不需要抛来决定的

还有...运行时异常是可以直接抛出而不用在方法上表明要抛出具体的异常类,
作者: 张波    时间: 2014-10-12 22:08
我觉得你说的那个结论是除 RuntimeException类和其子类之外的情况。
作者: 354620815    时间: 2014-10-12 22:13
在JAVA中子类覆盖父类方法时,可以不抛出编译时异常,如果抛出编译时异常,只能抛出父类编译时异常的子类。。。如果父类没有抛出编译时异常子类也不能抛出编译时异常。。。
运行时异常又叫:编译时不检测异常
作者: 354620815    时间: 2014-10-12 22:22
张波 发表于 2014-10-12 22:08
我觉得你说的那个结论是除 RuntimeException类和其子类之外的情况。

这不是我说的结论,是视频里的,我是那种死读书的,突然看到有点意外{:3_47:}
作者: 英雄传说ER    时间: 2014-10-12 22:37
本帖最后由 英雄传说ER 于 2014-10-12 22:40 编辑

父类没有抛出异常,子类就不能抛出           而对于RuntimeException异常,父类Object实际是抛出去了
“运行时异常”—— 出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。





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