さて、私はそれを引き起こす可能性があるものを理解し、読み込もうとしました、しかし私はそれを得ることができません:
コードのどこかにこれがあります。
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
つまり、何らかのメソッドを呼び出そうとすると、他の予期される例外(具体的にはInvocationTargetException
)の代わりにArrayIndexOutOfBoundsException
がスローされます。実際にどのメソッドが呼び出されるのか知っているので、このメソッドコードに直接行き、ArrayIndexOutOfBoundsException
をスローすると想定している行にtry-catchブロックを追加しました。期待通りにArrayIndexOutOfBoundsException
をスローしました。しかし上がるとどういうわけかInvocationTargetException
に変わり、上のコードではcatch(Exception e)
eはInvocationTargetException
であり、ArrayIndexOutOfBoundsException
ではありません。
このような動作の原因となる可能性があるもの、またはそのようなことを確認する方法を教えてください。
リフレクションを使用してメソッドを呼び出すことによって、さらに高度な抽象化が追加されました。リフレクションレイヤはInvocationTargetException
内の例外をラップします。これはリフレクションコールの失敗による例外 実際に と内部の失敗との違いを示します。メソッドが呼び出されました。
原因をInvocationTargetException
内で展開するだけで、元のものに戻ります。
元の例外を取得するには、InvocationTargetException
に対してgetCause()
メソッドを使用します。
次の場合は例外がスローされます。
InvocationTargetException - 基本となるメソッドが例外をスローした場合.
そのため、リフレクションAPIで呼び出されたメソッドが例外(たとえば、ランタイム例外)をスローした場合、リフレクションAPIはその例外をInvocationTargetException
にラップします。
Method.invoke()のJavadocから
例外:InvocationTargetException - 基本となるメソッドが例外をスローした場合.
この例外は、呼び出されたメソッドが例外をスローした場合にスローされます。
これは特定のメソッド内のコードの正確な行を表示します。これは呼び出されると例外を発生させます。
try {
// try code
..
m.invoke(testObject);
..
} catch (InvocationTargetException e) {
// Answer:
e.getCause().printStackTrace();
} catch (Exception e) {
// generic exception handling
e.printStackTrace();
}
そのInvocationTargetException
はおそらくあなたのArrayIndexOutOfBoundsException
をまとめているでしょう。リフレクションを使用しても、そのメソッドが何をスローすることができるかを前もって指示することはありません。そのため、throws Exception
アプローチを使用するのではなく、すべての例外がキャッチされてInvocationTargetException
にまとめられます。
これ のようなものについて説明します、
InvocationTargetExceptionは、呼び出されたメソッドまたはコンストラクタによってスローされた例外をラップするチェック済み例外です。リリース1.4以降、この例外は汎用の例外連鎖メカニズムに準拠するように改良されました。構築時に提供されgetTargetException()メソッドを介してアクセスされる「ターゲット例外」は、現在では原因として知られており、Throwable.getCause()メソッドおよび前述の「従来のメソッド」を介してアクセスすることができます。
このようにgetCause()メソッドを使用して、元の例外クラスと比較できます。
try{
...
} catch(Exception e){
if(e.getCause().getClass().equals(AssertionError.class)){
// handle your exception 1
} else {
// handle the rest of the world exception
}
}
class
のtry
/catch
ブロック内の外部class
でロガーオブジェクトを呼び出すステートメントからJava.lang.reflect.InvocationTargetException
エラーが発生しました。
Eclipseデバッガーのコードをたどり、ロガーステートメントの上にマウスを移動すると、ロガーobject
はnull
であることがわかりました(一部の外部定数をclass
の一番上にインスタンス化する必要がありました)。
基になるメソッド(Reflectionを使用して呼び出されたメソッド)が例外をスローした場合、この例外がスローされます。
そのため、リフレクションAPIによって呼び出されたメソッドが例外(たとえばランタイム例外など)をスローした場合、リフレクションAPIはその例外をInvocationTargetExceptionにラップします。
私は同じ問題に直面していました。 e.getCause()。getCause()を使用したところ、渡されたパラメータが間違っていたためです。パラメータの1つの値を取得する際にnullPointerExceptionがありました。これがお役に立てば幸いです。