19

JavaReflectionを使用してメソッドを呼び出したいと思います。

問題は、このメソッド(私が書いた)が例外をスローすることです(私はmyCustomExceptionを作成しました)。try / catch句を追加すると、Eclipseが「catch句に到達できません」と表示するため、プロジェクトを実行できません。

MyClassクラスでmyMethodを呼び出そうとすると次のようになります。

270.    myMethod.invoke(null, myParam); // NB : null because myMethod is static

myMethodがMyCustomExceptionをスローしない場合、すべてが正常です。しかし、MyCustomExceptionがスローされると、次のエラーメッセージが表示されます。

クラスBarClass()にあるfooMethod()を呼び出そうとしたとしましょう。

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

それも可能ですか?とにかく助けてくれてありがとう。

4

3 に答える 3

30

元の例外である原因を取得できます。

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 {
      ...
   }
}
于 2012-07-12T12:39:39.780 に答える
9

それを行う1つの方法:

try { myMethod.invoke(null, myParam); }
catch (InvocationTargetException e) { 
  try { throw e.getCause(); }
  catch (MyCustomException e) { ...}
  catch (MyOtherException e) { ...}
}
于 2012-07-12T12:47:56.057 に答える
1

catchを実行するメソッドに句を追加しようとしている場合myMethod.invoke(null, myParam)、それは明らかに正しい方法ではありません。この場合、リフレクションを介してメソッドを呼び出していますが、invokeメソッドが他の例外をスローするため、これは例外をキャッチする場所ではありません。例外をスローするメソッドを呼び出すと、例外がある場合、InvocationTargetException正しく思い出せば、例外がスローされて にラップされます。

については、この説明の最後の部分を確認してくださいInvocationTargetException

于 2012-07-12T12:44:18.097 に答える