2012-07-12 10 views
16

Java Reflectionを使ってメソッドを呼びたいと思います。Java Reflectionを使用して例外をスローするメソッドを呼び出す方法は?

問題は、このメソッド(私が書いた)が例外をスローすることです(私はを作成しました。myCustomException)。私がtry/catch節を追加すると、Eclipseは "catch節に到達できません"と言ってプロジェクトを実行できません。私はMyClassのクラスにMyMethodはを起動しようとすると、ここで

は次のとおりです。

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

MyMethodはMyCustomExceptionを投げていない場合は、eveythingで結構です。それは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 

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

+0

メソッド呼び出しが例外を投げているように見えます。 try-catchで囲みます。 – Razvan

答えて

23

元の例外の原因を知ることができます。ドキュメントから

InvocationTargetException.getCause(); 

InvocationTargetExceptionは、呼び出されるメソッドまたはコンストラクタによってスロー 例外をラップする、チェック済み例外です。あなたのcatchブロックで

http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/InvocationTargetException.html

例外は、あなたがそれを期待して扱うタイプからのものである場合、あなたがチェックすることができ。

一つの簡単な方法は、次のようになります。あなたがmyMethod.invoke(null, myParam)を実行する方法でcatch句を追加しようとしている場合

try { 
    ... 
} catch (InvocationTargetException ite) { 
    if (ite.getCause() instanceof SomeExceptionType) { 
     ... 
    } else { 
     ... 
    } 
} 
+0

ありがとう!できます。しかし、次のようにMyCustomExceptionを作成したとしても、「getCause()。getMessage()」を使ってMyCustomExceptionからメッセージを取得することはできません:new MyCustomException( "message")。 – cleroo

+0

これはあなたの特定の実装に起因すると思います。例外が実際にメッセージを保持しているかどうかをデバッグして確認できますか? –

+0

私はMarko Topolnikの方法で成功しました。とにかくありがとうございました。 – cleroo

1

、その後、それはそれを行うための正しい方法は明らかではありません。この場合、リフレクションを介してメソッドを呼び出すことになります。invokeメソッドは例外をスローするため、例外をキャッチする場所ではありません。例外がスローされたメソッドを呼び出すと、例外がある場合、スローされ、正しくリコールされたらInvocationTargetExceptionにラップされます。

InvocationTargetExceptionについては、this explanationの最後の部分を確認してください。それを行うには

9

一つの方法:

try { myMethod.invoke(null, myParam); } 
catch (InvocationTargetException e) { 
    try { throw e.getCause(); } 
    catch (MyCustomException e) { ...} 
    catch (MyOtherException e) { ...} 
} 
+0

+1素敵なアプローチ;) –

+0

実際には動作しませんでした:/ – cleroo

+0

それは動作します。私のMyCustomExceptionで、コンストラクターが正しく設定されていなかったのは私のせいでした。私はメッセージを渡しませんでした!愚かなエラー – cleroo

関連する問題