5

リフレクションを使用してオブジェクトを作成しています。構築されている実際のオブジェクトによっては、コンストラクターが特定のカスタム例外のthrows宣言を持っている場合があり、これをキャッチできることが重要です。

残念ながら、リフレクティブ構造を含むtryブロックのキャッチに例外を追加しようとすると、次の理由でコードがコンパイルされません。

「到達不能なcatchブロック。この例外はtryステートメント本体からスローされることはありません。」

基本クラスのExceptionをキャッチすることは機能することを理解しており、実際、私のコードでは問題ありません。ただし、将来的に他のオブジェクトに他の異なる例外が適用される可能性があり、catch内でinstanceofを使用し、他のすべてを再スローすることはエレガントではないように思われるため、常にそうであるとは限りません。

この例外がスローされる可能性があることを通知して、具体的にキャッチできるようにする方法はありますか?

編集:要求に応じていくつかのコード。上記の理由でコンパイルされません。

try{
  Constructor<? extends Thing> constructor = getClassType().getDeclaredConstructor(SomeParameter.class);
  Thing thing = constructor.newInstance(new SomeParameter());
}
catch(FoobarException e){
  //new Thing(SomeParameter p) might throw this
}
catch(ReflectiveOperationException | IllegalArgumentException | SecurityException e){}
4

2 に答える 2

12

例外は。でラップされてスローされますInvocationTargetException。それをキャッチして、原因を見てください。

于 2012-08-01T03:50:58.627 に答える
2

この例外がスローされる可能性があることを通知して、具体的にキャッチできるようにする方法はありますか?

いいえ。

その時点で、コンストラクターによってスローされた例外がキャッチInvocationTargetExceptionされ、代わりにがスローされるためです。これは、 javadocによって次のように簡潔に説明されています。

"スロー:[...] -基になるコンストラクターが例外をスローした場合。"InvocationTargetException

(「例外」と表示されているため、これはコンストラクターによってスローされるチェックされた例外とチェックされていない例外の両方に適用されることに注意してください。)

したがって、実際には、コンパイラはそのコンパイルエラーで真実を語っています。キャッチしようとしたチェック済みの例外は、その時点で伝播している可能性はありません。実際、JLS到達可能性ルールでは、コード確実に到達不能であると規定されています...したがって、コンパイルエラーが発生します。

于 2012-08-01T04:04:36.713 に答える