You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
        }
    } 
}

原示例的问题点

  1. 父类的注释写“父类未声明任何异常”,但实际代码是throws IOException,这是明显的注释错误
  2. 子类的注释写“方法声明非受检异常ArithmeticException”,但实际代码是throws FileNotFoundException——这是受检异常,而且是IOException的子类,注释和代码完全不匹配
  3. 原主方法中调用s.method()时没有处理受检异常,这会导致编译报错,必须通过try-catch捕获或者在main方法上声明抛出IOException

内容的提问来源于stack exchange,提问作者Rohit Karambali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:50:06