首页 > 解决方案 > 抽象方法中的多态性和检查异常抛出

问题描述

假设我们有一个类Foo,其中一个方法可能会抛出IOException.

public abstract class Foo {
    public abstract void foo() throws IOException;
}

FooImpl但是,当我像这样扩展该类时:

public class FooImpl extends Foo {
    public void foo() throws Exception {
        throw new Exception("This cannot throw!");
    }
}

这会导致编译时错误:“覆盖的方法不会抛出 java.lang.Exception”

我理解这是因为覆盖方法“可能只抛出它的父方法的检查异常和任何未经检查的异常”

为什么会这样呢?为什么我们要禁止自己抛出更广泛的异常?

(我也在寻找解决方法)

谢谢!

标签: javapolymorphism

解决方案


您必须始终能够在使用其超类的任何地方使用子类。这几乎就是子类的定义,更普遍地称为Liskov 替换原则

因此,鉴于 的定义,以下必须Foo有效:

Foo foo = getFooFromSomewhere();
try {
  foo.foo();
} catch (IOException e) {
  // handle e
}

...因为这与Foo.

对于 的这个定义FooImpl,这是行不通的,因为未处理Exception的 s 没有IOException被处理,并且作为已检查的异常,它们必须被捕获或以其他方式处理。


推荐阅读