面向对象开发中,如何处理父子类方法覆盖时的异常声明及契约约束?
- 内容介绍
- 相关推荐
本文共计778个文字,预计阅读时间需要4分钟。
方法覆盖时间,子类不能抛出比父类更宽泛的异常,这是面向对象中约束能力的直接体现。这并非语法限制,而是为了保证多态调用的安全性——调用的方法只依赖于父类的声明,必须能够处理所有可能的异常情况。
覆盖方法的异常声明规则
Java 中,子类重写父类方法时,其 throws 子句只能缩小或保持不变,不能扩大:
- 父类方法声明 throws IOException,子类可声明 throws FileNotFoundException(是 IOException 的子类),也可不写 throws
- 父类未声明 throws 任何检查异常,子类覆盖时也不能声明 throws 检查异常(如 IOException、SQLException)
- 运行时异常(RuntimeException 及其子类)不受此限,子类可自由添加或移除
为什么禁止扩大异常范围?
本质是里氏替换原则(LSP)在异常层面的延伸。
本文共计778个文字,预计阅读时间需要4分钟。
方法覆盖时间,子类不能抛出比父类更宽泛的异常,这是面向对象中约束能力的直接体现。这并非语法限制,而是为了保证多态调用的安全性——调用的方法只依赖于父类的声明,必须能够处理所有可能的异常情况。
覆盖方法的异常声明规则
Java 中,子类重写父类方法时,其 throws 子句只能缩小或保持不变,不能扩大:
- 父类方法声明 throws IOException,子类可声明 throws FileNotFoundException(是 IOException 的子类),也可不写 throws
- 父类未声明 throws 任何检查异常,子类覆盖时也不能声明 throws 检查异常(如 IOException、SQLException)
- 运行时异常(RuntimeException 及其子类)不受此限,子类可自由添加或移除
为什么禁止扩大异常范围?
本质是里氏替换原则(LSP)在异常层面的延伸。

