java.lang.reflect.InvocationTargetException の原因は何でしょうか? 質問する

java.lang.reflect.InvocationTargetException の原因は何でしょうか? 質問する

まあ、何が原因なのか理解しようとして読んでみましたが、わかりません。

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

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

問題は、何らかのメソッドを呼び出そうとすると、InvocationTargetException他の予期される例外 (具体的には ) ではなくがスローされることですArrayIndexOutOfBoundsException。実際にどのメソッドが呼び出されるかわかっているので、このメソッド コードに直接移動し、スローされるはずの行に try-catch ブロックを追加したところArrayIndexOutOfBoundsException、実際に予期どおりにスローされましたArrayIndexOutOfBoundsException。しかし、上に行くと、どういうわけか に変わりInvocationTargetException、上記のコードではにcatch(Exception e)なりInvocationTargetExceptionArrayIndexOutOfBoundsException予期どおりではありません。

このような動作の原因は何でしょうか、また、このようなことをどのように確認すればよいでしょうか?

ベストアンサー1

リフレクションを使用してメソッドを呼び出すことで、抽象化のレベルがさらに 1 つ追加されました。リフレクション レイヤーは、例外を でラップします。これにより、リフレクション呼び出しの失敗によって実際にInvocationTargetException発生した例外(たとえば、引数リストが有効でなかったなど) と、呼び出されたメソッド内で発生した失敗を区別できます。

内部の原因を解き明かすだけInvocationTargetExceptionで、元の原因にたどり着くことができます。

それを実行するには、exception.printStackTrace()上部/通常のセクションではなく、「原因:」セクションを確認します。

例外をキャッチしてgetCause()メソッドを使用することもできます。必要に応じて、これを再度スローすることもできます。try {...} catch (InvocationTargetException ex) { log.error("oops!", ex.getCause()) }または...catch... { throw ex.getCause() }

おすすめ記事