Java接口方法只能用throws声明受检异常,实现类重写时不得扩大异常范围,可缩小或取消;未声明受检异常则禁止新增,运行时异常则完全自由。

Java接口中的方法可以声明抛出异常,但仅限于受检异常(checked exception),且这种声明会对实现类构成明确约束:实现类重写该方法时,不能扩大异常范围,只能缩小或取消。
接口方法能用 throws 声明哪些异常
接口方法可以使用 throws 声明一个或多个受检异常,比如 IOException、SQLException。运行时异常(如 IllegalArgumentException、NullPointerException)无需声明,也不受限制。
- 声明受检异常,是向调用方传递“这个操作可能失败”的契约信号
- 声明本身不强制实现类必须抛出——实现类可以完全不抛异常(内部自行处理)
- 但一旦实现类选择抛出受检异常,就必须落在接口声明的范围内
实现类重写时的异常约束规则
实现类覆盖接口方法时,对 throws 的使用必须满足“异常范围不扩大”原则:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 可以不写
throws(即不抛任何受检异常) - 可以抛出接口中声明的异常类型本身(如接口写
throws IOException,实现类也写throws IOException) - 可以抛出该异常的**子类**(如
FileNotFoundException是IOException的子类,合法) - 不能抛出新的受检异常(如接口没声明
SQLException,实现类加throws SQLException→ 编译失败) - 不能抛出更宽泛的受检异常(如接口声明
throws IOException,实现类写throws Exception→ 编译失败)
父类无 throws 时,实现类也不能新增受检异常
如果接口方法签名中没有 throws(即未声明任何受检异常),那么实现类:
立即学习“Java免费学习笔记(深入)”;
- 绝对不可添加
throws声明受检异常(编译直接报错) - 若底层调用可能抛受检异常(如
new FileInputStream()),必须用try-catch拦截 - 常见做法是捕获后包装为运行时异常再抛出:
throw new RuntimeException(e)或自定义RuntimeException子类
运行时异常完全自由,不参与约束
无论接口是否声明、声明了什么,实现类都可以随时抛出任意 RuntimeException 及其子类:
- 不需要出现在
throws中 - 不破坏多态调用的异常处理逻辑(调用方本就不必强制捕获)
- 适合封装业务逻辑错误、参数校验失败等非系统资源类问题

















