子类重写父类方法时,抛出的受检异常只能缩小或不抛,不得新增或扩大;父类未声明则子类完全不可添加;运行时异常不受限;多继承时取异常声明交集。

子类重写父类方法时,抛出的受检异常(checked exception)必须严格受限——不能新增、不能扩大、只能缩小或不抛。这是编译器强制执行的规则,不是风格建议。
核心限制:只允许更具体,不允许更宽泛
判断依据是异常类型的继承关系:
- 父类方法声明 throws IOException → 子类可写 throws FileNotFoundException(合法,它是 IOException 的子类)
- 父类方法声明 throws IOException → 子类写 throws Exception 或 throws SQLException(非法,前者更宽,后者无关)
- 父类方法 没写 throws → 子类加 throws IOException(直接编译失败)
父类未声明受检异常时,子类完全不能添加
只要父类方法签名中没有 throws 受检异常,子类就不得在重写时声明任何 checked exception:
- 哪怕内部调用了
new FileInputStream(),也不能写throws IOException - 否则编译报错类似:
overridden method does not throw IOException - 此时必须在方法体内处理:用
try-catch捕获,并转为运行时异常或静默降级
运行时异常完全自由,可作为安全出口
RuntimeException 及其子类(如 IllegalArgumentException、自定义业务异常)不受上述限制:
立即学习“Java免费学习笔记(深入)”;
- 父类没声明异常,子类可以
throw new ValidationFailedException("参数错误") - 父类声明
throws IOException,子类仍可额外抛IllegalArgumentException - 这类异常不参与 throws 约束,因为调用方本就不必显式处理
多实现或多继承场景下取交集
当一个类既继承父类又实现接口,且两者同名方法声明了不同受检异常时:
- 若父类 throws IOException,接口 throws SQLException → 无法合法实现(无共同子类型),必须重构设计
- 若父类 throws IOException,接口 throws Exception → 子类只能 throws IOException 或其子类(取二者交集)
- 若父类无 throws,接口 throws SQLException → 子类必须 throws SQLException 或其子类(接口契约优先)


















