子类重写父类方法时可缩小throws声明的受检异常范围,即抛出更具体的子类异常、完全不抛或剔除部分异常,同时可自由添加runtimeexception子类。

子类重写父类方法时,若想缩小 throws 声明的受检异常范围,核心是让子类抛出的检查型异常更具体、更少,或完全不抛——这是编译器强制允许的安全操作,既符合里氏替换原则,也提升调用方异常处理的精准度。
只抛出父类异常的某个子类
当父类方法声明 throws IOException,子类可聚焦于某一种具体失败场景,比如仅文件未找到:
- 父类:
public void load() throws IOException - 子类合法写法:
public void load() throws FileNotFoundException
FileNotFoundException 是 IOException 的子类,语义更明确,调用方只需捕获该特定异常,无需为所有 IO 问题兜底。
完全不声明 throws(内部消化)
如果子类实现足够健壮,能自行处理所有可能的受检异常,就可省略 throws 子句:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 用 try-catch 捕获原异常
- 记录日志、返回默认值、或转换为父类允许的异常再抛出
- 例如:捕获 SQLException 后,封装为 DataAccessException(若父类已声明 throws DataAccessException)
剔除部分父类异常类型
父类若声明 throws IOException, SQLException,子类可根据实现实际风险,只保留其一:
- 子类可写:
public void save() throws IOException - 也可写:
public void save() throws SQLException - 甚至两者都不抛,直接内部处理
只要不新增、不扩大,减少数量就是合法的“缩小”。
配合运行时异常灵活补充
受检异常范围缩小的同时,可自由添加 RuntimeException 子类,不受限制:
- 例如:
public void parse() throws IllegalArgumentException - IllegalArgumentException 是运行时异常,无需出现在 throws 中也能抛;若显式写出,也完全合法
- 适合表达参数校验失败等编程逻辑问题,与 IO、DB 等外部依赖异常分层处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










