without thread solucion reflect method error authconfigfactory java exception reflection invoke

thread - ¿Cómo invocar un método que arroja una excepción usando la reflexión de Java?



java.lang.reflect.invocationtargetexception solucion (3)

Me gustaría invocar un método, utilizando Java Reflection.

El problema es que este método (que escribí) arroja una excepción (creé una myCustomException ). Cuando agrego una cláusula try / catch, no puedo ejecutar mi proyecto, porque Eclipse dice "la cláusula catch es inalcanzable".

Aquí es cuando trato de invocar myMethod en la clase MyClass :

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

Cuando myMethod no lanza MyCustomException , todo está bien. Pero cuando arroja una MyCustomException , aparece este mensaje de error:

Digamos que trato de invocar fooMethod () , que está en la clase BarClass () , y:

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

¿Es posible? Gracias por la ayuda de todos modos.


Puede obtener la causa de eso que sería la excepción original.

InvocationTargetException.getCause();

De la documentación:

InvocationTargetException es una excepción comprobada que envuelve una excepción lanzada por un método o constructor invocado.

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

En su bloque catch, puede verificar si la excepción es del tipo esperado y manejarlo.

Un enfoque simple sería:

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


Si está intentando agregar una cláusula catch en el método que ejecuta myMethod.invoke(null, myParam) , entonces obviamente no es la forma correcta de hacerlo. En este caso, está invocando el método a través de la reflexión y este no es el lugar para capturar la excepción, ya que el método de invoke arroja otras excepciones. Una vez que invoque el método que arroja la excepción, si hay una excepción, se lanzará y envolverá en InvocationTargetException , si no recuerdo mal.

Verifique la última parte de esta explicación sobre InvocationTargetException .


Una forma de hacerlo:

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