子类可缩小受检异常范围,即抛出父类异常的子类或不抛出任何受检异常,这合法且安全;但不可扩大、替换为无关类型或新增受检异常。

可以,而且这是完全合法且推荐的做法。
子类能缩小受检异常范围的具体表现
Java 允许子类在重写方法时,将父类声明的受检异常替换为它的**更具体的子类**,或**完全不抛出任何受检异常**。这符合“异常范围只能缩小或保持不变”的规则。
- 父类声明
throws IOException→ 子类可写throws FileNotFoundException(IOException的子类) - 父类声明
throws SQLException→ 子类可写throws SQLTimeoutException(它的子类) - 父类声明
throws Exception→ 子类可写throws IOException或throws IllegalArgumentException(注意:后者是运行时异常,不参与 throws 检查) - 父类声明
throws IOException→ 子类可直接不写throws,内部用try-catch吞掉或转换为返回值
为什么缩小是安全的
调用方按父类签名编写代码,比如 catch (IOException e),能自然捕获子类抛出的 FileNotFoundException。因为子类异常类型更具体,不会超出原有处理能力,反而让错误语义更清晰。
不能做的反例(容易误踩)
这些写法会直接编译失败:
- 父类
throws IOException→ 子类throws Exception(范围变宽) - 父类
throws IOException→ 子类throws SQLException(无关类型) - 父类没写
throws→ 子类加throws IOException(新增检查异常)
实用建议
优先考虑缩小异常范围,但更进一步的优化方向是:
- 把业务中可预期、需显式处理的错误,用更精确的自定义受检异常继承体系表达
- 对不可恢复或属于编程错误的场景,改用
RuntimeException子类,避开 throws 约束 - 若父子类异常语义差异大,不妨重构为组合模式,让异常处理逻辑解耦
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











