覆盖接口方法时删除Java检查的异常?

E. *_*ith 3 java overriding interface exception

我正在使用Java 7,遇到了一些非常有趣的事情。在使用我自己的接口扩展java.lang.Appendable接口时,我出于文档目的显式覆盖了每种方法,而不是任何事情。

java.lang.Appendable中定义的所有三个方法都抛出IOException,我认为我的重载方法也必须声明。但是,我最终删除了其中一个重写方法上的throws子句,奇怪的是Java 7编译器没有抱怨缺少声明。因此,我继续从其他两种方法中删除了throws子句,同样,编译器也没有抱怨。

那么,为什么我可以在接口中重写方法并删除其throws子句?何时这种现象在Java中成为合法的?

Boh*_*ian 5

父接口声明该方法可能会引发异常。不引发异常的实现符合可能的实现。您的接口声明,实现实际上并不会抛出异常,同时仍然遵守父接口的约定。

将实例分配给Appendable变量的代码将必须捕获定义的异常,而将实例视为子接口的代码则不必捕获。

简单地说:

interface Foo {
    void m() throws Exception;
}

interface Bar extends Foo {
    @Override
    void m();
}

void test(Foo foo, Bar bar) {
    foo.m(); // must catch exception
    bar.m(); // no exception declared to be thrown, so don't need to catch
}
Run Code Online (Sandbox Code Playgroud)

还请注意,重要的是变量的类型,而不是重要的对象:

Foo foo = new BarImpl();
foo.m(); // must catch exception
Run Code Online (Sandbox Code Playgroud)