子类重写父类方法时检查异常范围不能变宽,只能缩小或去掉;运行时异常可自由添加;若父类无throws声明,子类不得新增检查异常,应捕获后转为运行时异常。

只允许缩小或去掉检查异常
父类方法如果声明 throws IOException,子类重写时只能:
- 也写
throws IOException - 改写成更具体的子类,比如
throws FileNotFoundException - 直接去掉
throws,也就是不抛任何检查异常
不能写 throws Exception 或 throws SQLException(除非它是 IOException 的子类),否则编译器会报错:“overridden method does not throw …”
运行时异常完全自由
RuntimeException 及其子类(如 IllegalArgumentException、NullPointerException)不受限制:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 父类没声明任何异常,子类可以随意加
throws IllegalArgumentException - 父类已声明检查异常,子类还能额外加运行时异常声明
- 这类异常也不强制调用方处理,所以不影响契约一致性
父类没声明检查异常,子类也不能加
如果父类方法签名是 void doWork()(无 throws),子类重写时:
- 不能写
throws IOException—— 编译直接失败 - 遇到可能抛检查异常的代码(比如打开文件、连数据库),必须自己用
try-catch拦住 - 常见做法是转成运行时异常:
throw new RuntimeException(e)
推荐处理方式:优先封装,而非扩大声明
多数情况下,不建议让子类暴露新的检查异常。更稳妥的做法是:
- 用
try-catch捕获底层检查异常 - 包装成有意义的运行时异常再抛出,例如
throw new DataAccessException("save failed", e) - 这样既满足重写规则,又保留了错误上下文,调用方也无需新增
catch块
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










