重写接口方法时删除Java检查异常?

重写接口方法时删除Java检查异常?,java,exception,interface,overriding,Java,Exception,Interface,Overriding,我正在使用Java7,遇到了一些非常有趣的东西。在用我自己的接口扩展java.lang.Appendable接口的同时,为了文档的目的,我显式地重写了每个方法 java.lang.Appendable中定义的所有三个方法都会抛出IOException,我认为我的重写方法也必须声明IOException。然而,我最终删除了其中一个重写方法上的throws子句,奇怪的是,Java7编译器没有抱怨缺少声明。因此,我继续从其他两个方法中删除了throws子句,而且编译器没有抱怨 那么,为什么我可以重写接

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

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


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

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

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

简言之:

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

为什么不合法呢?为什么你必须错误地声明你的方法会抛出一个你知道它不会抛出的异常呢?我在想,如果有人说appendeable a=new MyInterfaceImpl();当他们说a.append(“Foo”);他们的代码仍然必须尝试捕获IOException(他们会这样做)。但是我想,如果MyInterface没有为可追加方法抛出IOException,那么这是有意义的,因为MyInterface实现永远不会抛出IOException。我只是惊讶地看到这项工作就是一切。谢谢你的洞察力!太棒了,这很有道理。谢谢