Java方法重写的异常处理:父类声明受检异常的子类规则
子类重写声明受检异常的父类方法的规则
刚好碰到过类似的问题,我来给你理清楚Java里子类重写带受检异常的父类方法时的核心规则:
- 子类重写的方法不能声明父类方法未提及的受检异常:也就是说,子类方法声明的受检异常必须是父类方法声明异常的子类(或者就是父类声明的异常本身)。这是为了保证多态场景下,调用父类引用的方法时,只需要处理父类声明的异常即可,不会出现意料之外的新异常。
- 子类方法可以完全不声明任何异常:哪怕父类方法声明了受检异常,子类重写时选择不抛出任何异常也是合法的,毕竟子类实现可能把异常内部处理掉了。
- 子类方法可以声明任意非受检异常:RuntimeException及其子类、Error及其子类都属于非受检异常,这类异常不受父类异常声明的限制,子类想声明多少都可以,编译器不会管这个。
关于你提供的示例代码的修正与说明
你给的示例代码里存在注释和代码逻辑不匹配的问题,我先修正并解释清楚:
修正后的可运行代码
import java.io.IOException; import java.io.FileNotFoundException; class SuperClass6 { // 父类明确声明了受检异常IOException void method() throws IOException { System.out.println("SuperClass"); } } // 子类继承父类 class SubClass6 extends SuperClass6 { // 子类声明的FileNotFoundException是IOException的子类,完全符合规则 void method() throws FileNotFoundException { System.out.println("SubClass"); } // 主方法 public static void main(String args[]) { SuperClass6 s = new SubClass6(); try { // 因为父类方法声明了受检异常IOException,这里必须捕获或声明抛出 s.method(); } catch (IOException e) { e.printStackTrace(); } } }
原示例的问题点
- 父类的注释写“父类未声明任何异常”,但实际代码是
throws IOException,这是明显的注释错误 - 子类的注释写“方法声明非受检异常ArithmeticException”,但实际代码是
throws FileNotFoundException——这是受检异常,而且是IOException的子类,注释和代码完全不匹配 - 原主方法中调用
s.method()时没有处理受检异常,这会导致编译报错,必须通过try-catch捕获或者在main方法上声明抛出IOException
内容的提问来源于stack exchange,提问作者Rohit Karambali
相关产品推荐
相关产品推荐

