How to invoke a method which throws an Exception using Java Reflection?

cleroo picture cleroo · Jul 12, 2012 · Viewed 26.5k times · Source

I would like to invoke a method, using Java Reflection.

The problem is that this method (which I wrote) throws an Exception (I created a myCustomException). When I add a try/catch clause, I can't run my project, because Eclipse says "the catch clause is unreachable".

Here is when I try to invoke myMethod in the class MyClass :

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

When myMethod does not throw a MyCustomException, eveything is fine. But when it throws a MyCustomException, I get this error message :

Let's say I try to invoke fooMethod(), which is in the class BarClass(), and :

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

Is it even possible ? Thanks for help anyway.

Answer

Francisco Spaeth picture Francisco Spaeth · Jul 12, 2012

You can get the cause of it that would be the original exception.

InvocationTargetException.getCause();

From documentation:

InvocationTargetException is a checked exception that wraps an exception thrown by an invoked method or constructor.

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

In your catch block, you could check if exception is from the type you expect and handle it.

One simple approach would be:

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