一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Java 中子类重写方法时怎样抛出异常

时间:2026-07-08 10:06:52 编辑:袖梨 来源:一聚教程网

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

子类重写父类方法时抛出异常,核心是遵守“异常范围不能变宽”这条编译规则。不是想抛什么就抛什么,而是必须和父类声明的检查异常保持兼容。

只允许缩小或去掉检查异常

父类方法如果声明 throws IOException,子类重写时只能:

  • 也写 throws IOException
  • 改写成更具体的子类,比如 throws FileNotFoundException
  • 直接去掉 throws,也就是不抛任何检查异常

不能写 throws Exceptionthrows SQLException(除非它是 IOException 的子类),否则编译器会报错:“overridden method does not throw …”

运行时异常完全自由

RuntimeException 及其子类(如 IllegalArgumentExceptionNullPointerException)不受限制:

  • 父类没声明任何异常,子类可以随意加 throws IllegalArgumentException
  • 父类已声明检查异常,子类还能额外加运行时异常声明
  • 这类异常也不强制调用方处理,所以不影响契约一致性

父类没声明检查异常,子类也不能加

如果父类方法签名是 void doWork()(无 throws),子类重写时:

立即学习“Java免费学习笔记(深入)”;

  • 不能写 throws IOException —— 编译直接失败
  • 遇到可能抛检查异常的代码(比如打开文件、连数据库),必须自己用 try-catch 拦住
  • 常见做法是转成运行时异常:throw new RuntimeException(e)

推荐处理方式:优先封装,而非扩大声明

多数情况下,不建议让子类暴露新的检查异常。更稳妥的做法是:

  • try-catch 捕获底层检查异常
  • 包装成有意义的运行时异常再抛出,例如 throw new DataAccessException("save failed", e)
  • 这样既满足重写规则,又保留了错误上下文,调用方也无需新增 catch

热门栏目