Java子类重写父类方法新增throws声明为何部分场景报编译错误
Java方法重写异常规则差异说明
这两段代码的运行差异是Java方法重写的异常声明规则导致的,核心规则如下:
- Java异常分为两类:受检异常(Checked Exception) 和 非受检异常(Unchecked Exception,即RuntimeException及其子类)
- 子类重写父类方法时,仅允许声明父类方法已声明的受检异常、或父类声明受检异常的子类,不能新增范围更大的、或父类未声明的受检异常;非受检异常不受该规则限制。
第一段代码编译报错的原因
父类Parent的msg()方法没有声明任何受检异常,子类TestExceptionChild重写msg()时声明抛出的IOException属于受检异常,违反了重写的异常限制规则。
另外代码中使用父类引用Parent p = new TestExceptionChild()调用msg()时,编译器会按照父类的msg()方法签名校验,父类方法无需处理受检异常,但子类实际实现需要抛出受检异常,逻辑上存在矛盾,因此直接触发编译错误。
第二段代码正常运行的原因
子类TestExceptionChild1重写msg()时声明抛出的ArithmeticException属于RuntimeException的子类,是非受检异常,不受重写异常规则的限制,因此编译、运行都可以正常执行。
内容的提问来源于stack exchange,提问作者Pranav Suryawanshi
相关产品推荐
相关产品推荐

