web-dev-qa-db-ja.com

例外がスロー句と互換性がない理由は何ですか?

「スロー」句と互換性がないように、例外の理由を誰かに教えてもらえますか

例えば:

class Sub extends Super{

    @Override
    void foo() throws Exception{

    }

}

class Super{

    void foo() throws IOException{

    }
}

Exception ExceptionはSuper.foo()のthrows句と互換性がありません

21
Franz Ebner

完全なコードサンプルがなければ、私は推測しかできません:サブクラスのメソッドをオーバーライド/実装していますが、サブクラスメソッドの例外仕様は、スーパークラス/インターフェイスメソッドのそれと互換性がありません(つまり、そのサブセットではありません)?

これは、ベースメソッドが例外をまったくスローしないように宣言されている場合、またはJava.io.IOException(メソッドがここでスローしようとしているJava.lang.Exceptionのサブクラスです)。基本クラス/インターフェイスのクライアントは、そのインスタンスが基本メソッドによって宣言されたコントラクトに準拠することを期待しているため、そのメソッドの実装からExceptionをスローすると、コントラクトが破壊されます(そして [〜#〜] lsp [〜#〜] )。

29
Péter Török

修正するにはRuntimeExceptionを使用します

public T findById(long id) throws RuntimeException {
    try {
          return whatEver.create();
    } catch (SystemException e) {
          throw new RuntimeException(e);
    }
}

お役に立てれば。

0
Aalkhodiry