Java中为什么子类重写父类方法时抛出的异常不能大于父类异常

见下方示例代码:


 
   
   
   
   
  1. import java.io.*;
  2. public class Father {
  3. public void father_function() throws IOException {
  4. new File( "a.txt");
  5. }
  6. }
  7. class Son extends Father {
  8. @Override
  9. public void father_function() throws Exception {
  10. new File( "b.txt");
  11. }
  12. }
  13. class Test {
  14. public static void main(String[] args) {
  15. Father fs = new Son();
  16. try {
  17. fs.father_function();
  18. } catch (IOException ie) {
  19. System.out.println( "发生了异常");
  20. }
  21. }
  22. }

代码说明:

  1. 定义了一个类,类名为Father,Father中包含一个普通实例方法,但是该方法会抛出IOException
  2. 定义了一个Father类的子类:Son,该类重写了父类Father的方法,但是子类重写方法后选择了抛出一个更大的异常
  3. 定义了一个Test类,包含一个main方法
  4. Test类中创建了一个Son类对象(也即Father类的子类对象),然后使用try...catch...语句将fs.father_function();这条会抛出异常的语句包围,并使用了IOException对象对当前可能产生的异常进行捕

结果:

         程序编译失败

原因分析:

1、在java多态机制中,对象引用fs在编译时期是属于父类类型也即Father类型,但是在运行时fs属于子类类型,也就是Son类型

2、也就是说在编译的时候,编译器发现catch中的IOException完全能将父类方法中抛出的异常捕获,因此编译通过,但是在运       行时期,由于fs变成了子类类型,子类重写的方法抛出的异常是Exception,显然IOException不能捕获这个比它更大的异           常,因此在运行时期也就出现失败

总结:这个示例也就演示了一个道理,在java中,子类重写父类的方法时,子类如果选择抛出异常,那么抛出的异常类型不能大于父类的异常类型

 

        
原创文章 6获赞 22访问量 1万+

你可能感兴趣的:(Java中为什么子类重写父类方法时抛出的异常不能大于父类异常)