How to invoke a method which throws an Exception u

2020-02-26 04:55发布

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.

3条回答
狗以群分
2楼-- · 2020-02-26 05:25

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 {
      ...
   }
}
查看更多
兄弟一词,经得起流年.
3楼-- · 2020-02-26 05:30

If you are trying to add a catch clause in the method that executes myMethod.invoke(null, myParam), then that's obviously not the right way of doing it. In this case you're invoking the method via reflection and this is not the place to be catching the exception, as the invoke method throws other exceptions. Once you invoke the method that throws the exception, if there is an exception, it will get thrown and wrapped in an InvocationTargetException, if I recall correctly.

Check the last part of this explanation concerning the InvocationTargetException.

查看更多
叼着烟拽天下
4楼-- · 2020-02-26 05:35

One way to do it:

try { myMethod.invoke(null, myParam); }
catch (InvocationTargetException e) { 
  try { throw e.getCause(); }
  catch (MyCustomException e) { ...}
  catch (MyOtherException e) { ...}
}
查看更多
登录 后发表回答