まあ、何が原因なのか理解しようとして読んでみましたが、わかりません。
私のコードのどこかにこれがあります:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
問題は、何らかのメソッドを呼び出そうとすると、InvocationTargetException
他の予期される例外 (具体的には ) ではなくがスローされることですArrayIndexOutOfBoundsException
。実際にどのメソッドが呼び出されるかわかっているので、このメソッド コードに直接移動し、スローされるはずの行に try-catch ブロックを追加したところArrayIndexOutOfBoundsException
、実際に予期どおりにスローされましたArrayIndexOutOfBoundsException
。しかし、上に行くと、どういうわけか に変わりInvocationTargetException
、上記のコードではにcatch(Exception e)
なりInvocationTargetException
、ArrayIndexOutOfBoundsException
予期どおりではありません。
このような動作の原因は何でしょうか、また、このようなことをどのように確認すればよいでしょうか?
ベストアンサー1
リフレクションを使用してメソッドを呼び出すことで、抽象化のレベルがさらに 1 つ追加されました。リフレクション レイヤーは、例外を でラップします。これにより、リフレクション呼び出しの失敗によって実際にInvocationTargetException
発生した例外(たとえば、引数リストが有効でなかったなど) と、呼び出されたメソッド内で発生した失敗を区別できます。
内部の原因を解き明かすだけInvocationTargetException
で、元の原因にたどり着くことができます。
それを実行するには、exception.printStackTrace()
上部/通常のセクションではなく、「原因:」セクションを確認します。
例外をキャッチしてgetCause()メソッドを使用することもできます。必要に応じて、これを再度スローすることもできます。try {...} catch (InvocationTargetException ex) { log.error("oops!", ex.getCause()) }
または...catch... { throw ex.getCause() }