不能。父类方法未声明受检异常时,子类重写不得添加任何 throws 受检异常,否则编译失败;必须在方法内用 try-catch 捕获并转为运行时异常或妥善处理。

不能。父类方法没写 throws,子类重写时就绝对不能声明任何受检异常——这是编译器强制执行的规则,不是建议,而是硬性限制。
核心判断依据:看父类方法签名有没有 throws 受检异常
只要父类方法声明中没有 throws 子句,或虽有 throws 但只列了 RuntimeException 及其子类(比如 throws IllegalArgumentException),那它就等价于“未声明受检异常”。此时子类重写:
- 加
throws IOException→ 编译失败 - 加
throws SQLException→ 编译失败 - 加
throws MyCheckedException extends Exception→ 编译失败
为什么不允许?多态调用会出问题
假设父类方法是 void save(),调用方代码写的是:
Parent p = new Child();<br>p.save(); // 这里只按 Parent 的契约来写逻辑
如果允许子类偷偷加 throws IOException,调用方就没法提前处理这个异常——编译器不会提醒它要 try-catch 或向上抛,运行时突然炸掉,违背了面向对象的契约一致性。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
遇到必须处理的受检异常怎么办?
子类方法体内如果调用了可能抛受检异常的操作(比如 new FileInputStream()),又不能往外声明,那就只能在方法内部消化:
- 用
try-catch捕获,然后转成运行时异常再抛:throw new RuntimeException(e) - 或者封装成更有业务含义的运行时异常:
throw new DataLoadFailedException("读取配置失败", e) - 也可以静默处理(不推荐),比如记录日志后返回默认值
运行时异常可以自由添加
父类没声明异常,子类重写时加 throws IllegalArgumentException 或 throws NullPointerException 完全合法,编译器不管——因为这类异常本就不强制捕获,也不影响调用方的代码结构。

















