1. ホーム

[解決済み】 java.lang.reflect.InvocationTargetException の原因は何でしょうか?

2022-03-25 09:38:44

質問

さて、何が原因なのか理解し読もうとしたのですが、どうしても理解できません。

私のコードのどこかにこんなものがあります。

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

問題は、あるメソッドを呼び出そうとしたときに InvocationTargetException の代わりに、他の期待される例外(具体的には ArrayIndexOutOfBoundsException ). どのメソッドが呼び出されたのかが分かっているので、このメソッドのコードに直接アクセスして、次のような行にトライ・キャッチ・ブロックを追加しました。 ArrayIndexOutOfBoundsException を投げると、本当に ArrayIndexOutOfBoundsException は予想通りでした。しかし、上に行くときは に変更されます。 InvocationTargetException で、上のコードでは catch(Exception e) eは InvocationTargetException であって ArrayIndexOutOfBoundsException は期待通りです。

このような動作の原因は何でしょうか、またそのようなことを確認するにはどうしたらよいのでしょうか。

解決方法は?

リフレクションでメソッドを呼び出すことで、抽象化のレベルを追加しています。リフレクション層はどんな例外も InvocationTargetException という例外を区別することができます。 実際に リフレクションの呼び出しに失敗したことによるもの(たとえば、引数リストが有効でなかったとか)と、呼び出されたメソッド内の失敗によるものです。

の中にある原因を解きほぐすだけです。 InvocationTargetException をクリックすると、元のものにたどり着きます。