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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在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. }
复制代码
这是为什么?



5 个回复

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

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

这不是我说的结论,是视频里的,我是那种死读书的,突然看到有点意外{:3_47:}
回复 使用道具 举报
本帖最后由 英雄传说ER 于 2014-10-12 22:40 编辑

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