子类重写父类方法时,检查型异常只能缩小或取消,不得扩大或新增;运行时异常完全自由;构造器中父类声明的检查异常需在子类构造器中显式声明或捕获处理。

子类重写父类方法时,抛出的异常类型受编译器严格约束,核心是保障多态调用的安全性——调用方按父类签名编写代码,必须能稳定应对所有子类实现。规则分两类:检查型异常(checked exception)和非检查型异常(unchecked exception)。
检查型异常只能缩小或取消,不能扩大或新增
父类方法若声明 throws IOException,子类重写时:
- 可以不写 throws(即内部全部捕获处理)
- 可以仍写 throws IOException
- 可以写更具体的子类,如 throws FileNotFoundException
- 但不能写 throws Exception、throws SQLException 或 throws Throwable——这些要么范围更宽,要么与父类异常无关,编译直接报错
父类没声明检查异常,子类也不得添加
如果父类方法签名是 void doWork()(无 throws),子类重写时:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 不允许新增任何检查型异常,例如 throws IOException 会编译失败
- 若内部调用可能抛检查异常的方法(如 FileInputStream 构造),必须用 try-catch 拦住
- 常见做法是捕获后包装为运行时异常: throw new RuntimeException(e)
运行时异常完全自由,无需声明也无继承限制
RuntimeException 及其子类(如 IllegalArgumentException、IllegalStateException)不受上述规则约束:
- 父类未声明任何异常,子类可直接 throw new IllegalArgumentException()
- 父类已声明 throws IOException,子类仍可额外抛出 IllegalArgumentException,且不必写在 throws 子句中
- 这类异常体现的是程序逻辑问题或不可恢复错误,调用方本就不强制处理
构造器异常需单独处理
子类构造器不继承父类构造器,但若父类构造器声明了检查异常(如 throws ParseException),子类构造器必须显式应对:
- 在自己的 throws 中声明相同或更具体的异常
- 或用 try-catch 捕获后转为运行时异常再抛出
- 不能忽略,否则编译不通过
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










