web-dev-qa-db-ja.com

Java.lang.reflect.InvocationTargetExceptionの原因は何ですか?

さて、私はそれを引き起こす可能性があるものを理解し、読み込もうとしました、しかし私はそれを得ることができません:

コードのどこかにこれがあります。

 try{
 ..
 m.invoke(testObject);
 ..
 } catch(AssertionError e){
 ...
 } catch(Exception e){
 ..
 }

つまり、何らかのメソッドを呼び出そうとすると、他の予期される例外(具体的にはInvocationTargetException)の代わりにArrayIndexOutOfBoundsExceptionがスローされます。実際にどのメソッドが呼び出されるのか知っているので、このメソッドコードに直接行き、ArrayIndexOutOfBoundsExceptionをスローすると想定している行にtry-catchブロックを追加しました。期待通りにArrayIndexOutOfBoundsExceptionをスローしました。しかし上がるとどういうわけかInvocationTargetExceptionに変わり、上のコードではcatch(Exception e)eはInvocationTargetExceptionであり、ArrayIndexOutOfBoundsExceptionではありません。

このような動作の原因となる可能性があるもの、またはそのようなことを確認する方法を教えてください。

280
user550413

リフレクションを使用してメソッドを呼び出すことによって、さらに高度な抽象化が追加されました。リフレクションレイヤはInvocationTargetException内の例外をラップします。これはリフレクションコールの失敗による例外 実際に と内部の失敗との違いを示します。メソッドが呼び出されました。

原因をInvocationTargetException内で展開するだけで、元のものに戻ります。

300
Jon Skeet

元の例外を取得するには、InvocationTargetExceptionに対してgetCause()メソッドを使用します。

41
Daniel Ward

次の場合は例外がスローされます。

InvocationTargetException - 基本となるメソッドが例外をスローした場合.

そのため、リフレクションAPIで呼び出されたメソッドが例外(たとえば、ランタイム例外)をスローした場合、リフレクションAPIはその例外をInvocationTargetExceptionにラップします。

41
Andreas_D

Method.invoke()のJavadocから

例外:InvocationTargetException - 基本となるメソッドが例外をスローした場合.

この例外は、呼び出されたメソッドが例外をスローした場合にスローされます。

19
Peter Lawrey

これは特定のメソッド内のコードの正確な行を表示します。これは呼び出されると例外を発生させます。

try {

    // try code
    ..
    m.invoke(testObject);
    ..

} catch (InvocationTargetException e) {

    // Answer:
    e.getCause().printStackTrace();
} catch (Exception e) {

    // generic exception handling
    e.printStackTrace();
}
9
Rocky Inde

そのInvocationTargetExceptionはおそらくあなたのArrayIndexOutOfBoundsExceptionをまとめているでしょう。リフレクションを使用しても、そのメソッドが何をスローすることができるかを前もって指示することはありません。そのため、throws Exceptionアプローチを使用するのではなく、すべての例外がキャッチされてInvocationTargetExceptionにまとめられます。

8
Liv

これ のようなものについて説明します、

InvocationTargetExceptionは、呼び出されたメソッドまたはコンストラクタによってスローされた例外をラップするチェック済み例外です。リリース1.4以降、この例外は汎用の例外連鎖メカニズムに準拠するように改良されました。構築時に提供されgetTargetException()メソッドを介してアクセスされる「ターゲット例外」は、現在では原因として知られており、Throwable.getCause()メソッドおよび前述の「従来のメソッド」を介してアクセスすることができます。

2

このようにgetCause()メソッドを使用して、元の例外クラスと比較できます。

try{
  ...
} catch(Exception e){
   if(e.getCause().getClass().equals(AssertionError.class)){
      // handle your exception  1
   } else {
      // handle the rest of the world exception 
   }
} 
1
Mehdi

classtry/catchブロック内の外部classでロガーオブジェクトを呼び出すステートメントからJava.lang.reflect.InvocationTargetExceptionエラーが発生しました。

Eclipseデバッガーのコードをたどり、ロガーステートメントの上にマウスを移動すると、ロガーobjectnullであることがわかりました(一部の外部定数をclassの一番上にインスタンス化する必要がありました)。

1
Stuart Cardall

基になるメソッド(Reflectionを使用して呼び出されたメソッド)が例外をスローした場合、この例外がスローされます。

そのため、リフレクションAPIによって呼び出されたメソッドが例外(たとえばランタイム例外など)をスローした場合、リフレクションAPIはその例外をInvocationTargetExceptionにラップします。

0
Nikhil Kumar

私は同じ問題に直面していました。 e.getCause()。getCause()を使用したところ、渡されたパラメータが間違っていたためです。パラメータの1つの値を取得する際にnullPointerExceptionがありました。これがお役に立てば幸いです。

0
Deepak Vajpayee