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

时间:2016-08-29 23:36:26

标签: java exception interface override

我正在使用Java 7并且遇到了一些非常有趣的东西。在使用我自己的接口扩展java.lang.Appendable接口的同时,为了文档目的,我明确地重写每个方法。

java.lang.Appendable中定义的所有三个方法抛出IOException,我认为我的重写方法也必须声明。但是,我最终删除了一个重写方法的throws子句,奇怪的是Java 7编译器没有抱怨丢失的声明。所以我继续从其他两种方法中删除了throws子句,并且再次没有来自编译器的抱怨。

那为什么我可以覆盖接口中的方法并删除它的throws子句呢?什么时候这种现象在Java中变得合法?

1 个答案:

答案 0 :(得分:4)

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

将实例分配给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
}

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

Foo foo = new BarImpl();
foo.m(); // must catch exception