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

见下方示例代码:

import java.io.*;

public class Father {

public void father_function() throws IOException {

new File("a.txt");

}

}

class Son extends Father {

@Override

public void father_function() throws Exception {

new File("b.txt");

}

}

class Test {

public static void main(String[] args) {

Father fs = new Son();

try {

fs.father_function();

}catch (IOException ie) {

System.out.println("发生了异常");

}

}

}

代码说明:

定义了一个类,类名为Father,Father中包含一个普通实例方法,但是该方法会抛出IOException

定义了一个Father类的子类:Son,该类重写了父类Father的方法,但是子类重写方法后选择了抛出一个更大的异常

定义了一个Test类,包含一个main方法

Test类中创建了一个Son类对象(也即Father类的子类对象),然后使用try...catch...语句将fs.father_function();这条会抛出异常的语句包围,并使用了IOException对象对当前可能产生的异常进行捕

结果:

程序编译失败

原因分析:

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

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这句话的意思是,如果一个父类方法抛出了某些异常,那么任何重写方法子类方法抛出异常类型,必须要与父类方法抛出异常类型相同或者更加具体化,而不允许更加宽泛或者抛出不相关的异常。 这个规则可以帮助我们在编写代码,避免异常类型过多造成的混乱和不必要的捕获处理操作。如果子类异常类型与父类不匹配,那么在方法调用可能会出现意外的异常抛出,影响程序的正确性和可靠性。因此,遵循这个规则可以帮助我们保证代码的正确性和可维护性。 ### 回答2: 子类重写方法抛出异常类型必须大于等于父类重写方法抛出异常类型是因为Java异常处理机制要求子类重写父类方法,所抛出异常类型不能父类异常类型更加宽泛(或者说更加一般化)。 这是因为Java采用的是面向对象编程的思想,子类父类的一种特殊情况或者说派生类,它应该继承父类的特性和行为,并且可以扩展或修改它们。当子类重写父类方法子类异常类型应该在父类异常类型的基础上进行精确和细化,使得捕获异常的处理程序更具体和有针对性。 如果子类重写方法抛出异常类型比父类异常类型更加宽泛,也就是说子类异常类型比父类异常类型更一般,那么在使用多态的候,捕获异常可能会引发一些问题。因为多态性允许使用父类的引用指向子类的对象,如果子类抛出异常类型更加宽泛,那么在使用父类引用调用子类方法,可能无法准确地处理或捕获子类抛出异常。 因此,为了确保代码的健壮性和可靠性,子类重写方法抛出异常类型必须大于等于父类重写方法抛出异常类型。这样可以确保代码在使用多态性能够准确地处理异常,并且提供更加具体和有针对性的异常处理策略。这也符合Java异常处理规范,使得代码更加规范和可维护。 ### 回答3: 子类重写父类方法方法异常类型必须遵循一个规则:子类重写方法抛出异常类型必须大于等于父类重写方法抛出异常类型。 这是因为子类重写父类方法子类被认为是一种特殊的父类实例,如果子类抛出异常类型比父类更具体或更广泛,那么在使用父类实例调用子类重写方法,可能会出现异常类型不匹配的情况。 举个例子,假设有一个父类Animal,其有一个方法叫做eat(),它声明了一个可能抛出异常的类型AnimalException。现在有一个子类Dog,它重写了eat()方法,但是抛出了一个更具体的异常类型DogException。 如果我们允许这种情况发生,那么在使用父类Animal的实例调用重写的eat()方法,我们无法预测会抛出什么类型的异常。这就导致了代码的不确定性和容易引发异常的风险。 因此,为了确保代码的可靠性和可维护性,Java语言规定子类重写方法抛出异常类型必须大于等于父类重写方法抛出异常类型。也就是说,子类重写方法抛出异常类型可以是父类异常类型的子类或者与父类异常类型相同的类型,但不能父类异常类型的父类或者没有关系的类型。 通过遵守这个规则,我们可以在代码清晰地定义异常类型,提供更好的代码可读性和可维护性,同,也能更好地处理异常情况,提高程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值