异常不与throws子句兼容的原因是什么?

Fra*_*ner 18 java exception-handling exception

任何人都可以告诉我异常可能有什么原因,而不是与"throws"条款兼容

例如:

class Sub extends Super{

    @Override
    void foo() throws Exception{

    }

}

class Super{

    void foo() throws IOException{

    }
}
Run Code Online (Sandbox Code Playgroud)

异常异常与Super.foo()中的throws子句不兼容

Pét*_*rök 27

如果没有完整的代码示例,我只能猜测:您在子类中重写/实现方法,但子类方法的异常规范与超类/接口方法的异常规范不兼容(即不是其子集)?

如果声明基本方法根本不抛出任何异常,或者例如java.io.IOException(这是java.lang.Exception你的方法的子类试图抛出这里),就会发生这种情况.基类/接口的客户端期望其实例遵守基本方法声明的契约,因此Exception从该方法的实现中抛出会破坏契约(和LSP).

  • 它允许添加一些东西.但是当你为一个重写方法添加一个异常类型时,你不会添加一些东西,而是删除一些东西:使用基类,你可以保证永远不会得到异常,但是对于子类,你会失去这个保证.这就是它被禁止的原因. (7认同)