最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Java 中子类重写方法时怎样抛出异常
时间:2026-07-08 10:06:52 编辑:袖梨 来源:一聚教程网
子类重写父类方法时检查异常范围不能变宽,只能缩小或去掉;运行时异常可自由添加;若父类无throws声明,子类不得新增检查异常,应捕获后转为运行时异常。子类重写父类方法时抛出异常,核心是遵守“异常范围不能变宽”这条编译规则。不是想抛什么就抛什么,而是必须和父类声明的检查异常保持兼容。
只允许缩小或去掉检查异常
父类方法如果声明 throws IOException,子类重写时只能:
- 也写
throws IOException - 改写成更具体的子类,比如
throws FileNotFoundException - 直接去掉
throws,也就是不抛任何检查异常
不能写 throws Exception 或 throws SQLException(除非它是 IOException 的子类),否则编译器会报错:“overridden method does not throw …”
运行时异常完全自由
RuntimeException 及其子类(如 IllegalArgumentException、NullPointerException)不受限制:
- 父类没声明任何异常,子类可以随意加
throws IllegalArgumentException - 父类已声明检查异常,子类还能额外加运行时异常声明
- 这类异常也不强制调用方处理,所以不影响契约一致性
父类没声明检查异常,子类也不能加
如果父类方法签名是 void doWork()(无 throws),子类重写时:
立即学习“Java免费学习笔记(深入)”;
- 不能写
throws IOException—— 编译直接失败 - 遇到可能抛检查异常的代码(比如打开文件、连数据库),必须自己用
try-catch拦住 - 常见做法是转成运行时异常:
throw new RuntimeException(e)
推荐处理方式:优先封装,而非扩大声明
多数情况下,不建议让子类暴露新的检查异常。更稳妥的做法是:
- 用
try-catch捕获底层检查异常 - 包装成有意义的运行时异常再抛出,例如
throw new DataAccessException("save failed", e) - 这样既满足重写规则,又保留了错误上下文,调用方也无需新增
catch块
相关文章
- 《Disney Lorcana: Wilds Unknown》预购开启 首批《Toy Story》及皮克斯卡牌购买指南 07-29
- 车来了赶车闹钟如何设置 07-29
- 崩坏星穹铁道余晖残卷巨剑守护打法攻略 07-29
- 崩坏星穹铁道砂金角色部分背景介绍 07-29
- 崩坏3雷电芽衣什么时候上线 07-29
- 玩具熊的五夜后宫4代噩梦气球男孩Nightmare Balloon Boy介绍 07-29