4

2つの質問があります:

  1. オーバーライドされたメソッドが新しいチェックされた例外をスローできないという制約の目的は何ですか?
  2. オーバーライドされたメソッドが、スーパークラスのオーバーライドされたメソッドのthrows句で指定された、すべてまたはまったく、またはチェックされた例外のサブセットのみをスローできるのはなぜですか?
4

4 に答える 4

9

どちらの場合も、オーバーライドしている基本メソッドが呼び出し元のコードとのコントラクトを設定しているためです。メソッドがスローする可能性のあるチェック済みの例外に追加できる場合は、契約を破ることになります。

チェックされた例外をスローするBaseメソッドを持つクラスを考えてみましょう。から派生し、オーバーライドする もあります。のコードは変数を使用していますが、 の新しいインスタンスで初期化し、 を呼び出しています。コントラクトは、単に;をスローすることです。他のものを投げると契約が破られます。fooSomeExceptionDerivedBasefooAppBase bDerivedb.foo()fooSomeException

于 2012-06-06T11:14:10.357 に答える
3

置換原則のため。

つまり、クラス階層のユーザーを新しい動作で驚かせてはならないからです。

この原則は、Javaに固有ではなく、すべてのOO設計/言語に共通です。

于 2012-06-06T11:16:45.363 に答える
2

オーバーライド クラスは動作を追加できますが、削除はできません。例外をスローすることを宣言するメソッドは、動作です。

Aクラスとがあるとどうなるか考えてみてくださいB extends A
A実装foo() throws MyExceptionし、B実装しますfoo() throws OtherException

何が

A a = new B();
a.foo();

キャッチする必要がありますか?

ただし、B.foo()が例外のサブセットのみをスローする場合 - それでも完全に安全ですが、呼び出し元の環境は、 がスローしたすべてのA例外をキャッチ (またはスローしていると宣言) し、そうすることで、すべての B も処理します。

于 2012-06-06T11:15:10.930 に答える
2

オーバーライドされたメソッドに新しくスローされた例外を追加できるとしましょう。

class AA{
    void method() throws FileNotFoundException{}
}
class BB extends AA{
    @Override
    void method() throws FileNotFoundException, UnsupportedEncodingException {}
}   

次に、オブジェクト BB への参照 AA を作成し、メソッドを呼び出します。

AA a=new BB();
try {
    a.method();
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

FileNotFoundExceptionコンパイラは例外のみをキャッチできUnsupportedEncodingException、参照 AA から呼び出されるため、キャッチを許可しません。

ただし、オーバーライドされたメソッドにいくつかの種類の例外を追加できます

  • 既にスローされた例外のサブタイプ ( IOException-> IOException, FileNotFoundException) である場合は、チェックされるため、
  • 新しい例外をチェックする必要がない場合 -> all RuntimeExceptions
于 2012-06-06T11:25:38.157 に答える