Java Reflectionを使用してメソッドを呼び出したいと思います。
問題は、このメソッド(私が書いた)が例外をスローすることです(私はmyCustomExceptionを作成しました)。 try/catch句を追加すると、Eclipseが「catch句に到達できません」と表示するため、プロジェクトを実行できません。
これが私がクラスでmyMethodを呼び出そうとしたときですMyClass:
270. myMethod.invoke(null, myParam); // NB : null because myMethod is static
myMethodがMyCustomExceptionをスローしない場合、すべてが正常です。しかし、MyCustomExceptionをスローすると、次のエラーメッセージが表示されます。
クラスにあるfooMethod()を呼び出そうとしたとしましょうBarClass()、そして:
Java.lang.reflect.InvocationTargetException
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at Java.lang.reflect.Method.invoke(Unknown Source)
at com.tests.MyClass.test5(270)
at com.tests.MyClass.main(297)
Caused by: com.tests.MyCustomException
at com.tests.barClass.fooMethod(BarClass.Java:129)
... 6 more
それも可能ですか?とにかく助けてくれてありがとう。
元の例外となる原因を突き止めることができます。
InvocationTargetException.getCause();
ドキュメントから:
InvocationTargetExceptionは、呼び出されたメソッドまたはコンストラクターによってスローされた例外をラップするチェック済みの例外です。
http://docs.Oracle.com/javase/6/docs/api/Java/lang/reflect/InvocationTargetException.html
Catchブロックで、例外が予期したタイプのものであるかどうかを確認し、それを処理できます。
簡単なアプローチの1つは次のとおりです。
try {
...
} catch (InvocationTargetException ite) {
if (ite.getCause() instanceof SomeExceptionType) {
...
} else {
...
}
}
それを行う1つの方法:
try { myMethod.invoke(null, myParam); }
catch (InvocationTargetException e) {
try { throw e.getCause(); }
catch (MyCustomException e) { ...}
catch (MyOtherException e) { ...}
}
myMethod.invoke(null, myParam)
を実行するメソッドにcatch
句を追加しようとしている場合、それは明らかに正しい方法ではありません。この場合、リフレクションを介してメソッドを呼び出していますが、invoke
メソッドが他の例外をスローするため、これは例外をキャッチする場所ではありません。例外をスローするメソッドを呼び出すと、例外がある場合、正しく思い出せば、例外がスローされ、InvocationTargetException
にラップされます。
InvocationTargetException
に関する この説明 の最後の部分を確認してください。