2

InvalidResourceExceptionがResourceExceptionのサブクラスであると想定します。2つの方法を定義します。

void handleException(ResourceException e) {
  System.out.println("ResourceException " + e.toString());
}
void handleException(InvalidResourceException e) {
  System.out.println("InvalidResourceException " + e.toString());
}

次のコード:

try {
  throw new InvalidResourceException("invalid resource");
} catch (ResourceException e) {
  handleException(e);
}

これを印刷します:

ResourceException: com.myPackage.InvalidResourceException: invalid resource

しかし、次のコード:

   try {
     throw new InvalidResourceException("invalid resource");
   } catch (InvalidResourceException e) {
     handleException(e);
   } catch (ResourceException e) {
     handleException(e);
   }

これを印刷します:

InvalidResourceException:  com.myPackage.InvalidResourceException: invalid resource

これは、SunのJDK1.5.0_15を使用したものです。

これはJava標準と一致していますか?

このコードは何をすべきですか?

Exception e = new InvalidResourceException("invalid resource");
handleException(e);

このコードは何をすべきですか?

Exception e = new InvalidResourceException("invalid resource");
if (e instanceOf ResourceException) {
  handleException(e);
} else if (e instanceOf InvalidResourceException) {
  handleException(e);
} else {
  handleException(e):
}
4

3 に答える 3

11

はい。あたりです。過負荷は常に静的に解決されます。

後者の2つの例はどちらも、eの静的型がExceptionであるためコンパイルされず、どちらのオーバーロードもその型を受け入れません。

編集:

最後の例は、実際にはtry/catchブロックに直接類似しているわけではないことに注意してください。try / catchには、2つの変数があります。eキャッチごとに1つで、静的タイプはそれぞれInvalidResourceExceptionResourceExceptionです。最後の例では、という名前の単一の変数がeあり、その静的型はExceptionです。新しい変数を追加し、キャストでそれらに割り当てた場合、try / catchと同じ動作が得られます(ただし、最後のelseブランチを失う必要があります)。

于 2009-11-25T19:35:59.707 に答える
1

あなたの質問の最初の部分に関して、呼び出す正しいメソッドは、変数が宣言されている型に基づいてコンパイル時に決定されます。たとえば、InvalidResourceException をキャッチするように catch ステートメントを変更した場合、代わりに handleException(InvalidResourceException) オーバーロードが呼び出されます。

質問の 2 番目の部分に関しては、JVM は、スローされた例外を処理できる最初の catch ステートメントを単純に見つけます。代わりに ResourceException をスローすると、2 番目の catch ブロックが実行されます。

3 番目の部分は、単純な例外を処理するための適切な handleException() メソッドが存在しないため、コンパイルされません。

最後の部分も、3 番目の部分と同じ理由でコンパイルに失敗します。

于 2009-11-25T19:55:10.510 に答える
0

Java でサポートされていない「ダブル ディスパッチ」と呼ばれるものを期待しています。

于 2009-11-25T22:11:49.870 に答える