Bueno, he tratado de entender y leer lo que podría causarlo, pero no puedo entenderlo:
Tengo esto en algún lugar de mi código:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
La cosa es que, cuando intenta invocar algún método, lanza en
InvocationTargetException
lugar de alguna otra excepción esperada (específicamente ArrayIndexOutOfBoundsException
). Como realmente sé qué método se invoca, fui directamente a este código de método y agregué un bloque try-catch para la línea que se supone que debe lanzar ArrayIndexOutOfBoundsException
y realmente arrojó ArrayIndexOutOfBoundsException
como se esperaba. Sin embargo, al subir, de alguna manera cambia a InvocationTargetException
y en el código anterior, catch(Exception e)
e es InvocationTargetException
y no ArrayIndexOutOfBoundsException
como se esperaba.
¿Qué podría causar tal comportamiento o cómo puedo verificarlo?
fuente
InvocationTargetException
", acabo de descubrir que si lo tiene impreso usandoexception.printStackTrace()
, simplemente mire la sección "Causado por:" en lugar de la mitad superior / sección normal.try {...} catch (InvocationTargetException ex) { log.error("oops!", ex.getCause()) }
o...catch... { throw ex.getCause() }
you just look at the "Caused By:" section instead of the top half/normal section
La excepción se produce si
Entonces, si el método, que se ha invocado con la API de reflexión, arroja una excepción (excepción de tiempo de ejecución, por ejemplo), la API de reflexión envolverá la excepción en un
InvocationTargetException
.fuente
Use el
getCause()
método enInvocationTargetException
para recuperar la excepción original.fuente
Del Javadoc de Method.invoke ()
Esta excepción se produce si el método llamado arrojó una excepción.
fuente
java.lang.reflect.Proxy
instancias que aumentan un objeto envuelto. Cada unoProxy
maneja con gracia una excepción específica (posiblemente lanzada por el objeto envuelto) usando el suyoInvocationHandler
. Para que una excepción se extienda a través de esta cascada hasta llegar al controlador / proxy de invocación correcto, en cada unoInvocationHandler
, lo atraparíaInvocationTargetException
, desenvolvería, verificaría si la excepción envuelta esinstanceof
la excepción a ser manejada por estoInvocationHandler
. Si no es uninstanceof
, lanzaría la excepción sin envolver ... ¿verdad?Eso
InvocationTargetException
probablemente está terminando tuArrayIndexOutOfBoundsException
. No se puede decir por adelantado cuando se usa la reflexión lo que ese método puede arrojar, por lo que, en lugar de usar unthrows Exception
enfoque, todas las excepciones se están atrapando y envolviendoInvocationTargetException
.fuente
Esto imprimirá la línea exacta de código en el método específico, que cuando se invoca, genera la excepción:
fuente
Esto describe algo como,
fuente
Puede comparar con la clase de excepción original usando el método getCause () de esta manera:
fuente
Tuve un
java.lang.reflect.InvocationTargetException
error de una declaración que llama a un objeto logger en un externoclass
dentro de untry
/catch
bloque en miclass
.Al recorrer el código en el depurador de Eclipse y al pasar el mouse sobre la instrucción del registrador, vi que el registrador
object
eranull
(algunas constantes externas debían instanciarse en la parte superior de miclass
).fuente
Esta excepción se produce si el método subyacente (método llamado usando Reflection) arroja una excepción.
Entonces, si el método, que ha sido invocado por la API de reflexión, arroja una excepción (como por ejemplo, la excepción de tiempo de ejecución), la API de reflexión envolverá la excepción en una excepción InvocationTargetException.
fuente
Estaba enfrentando el mismo problema. Usé e.getCause (). GetCause () luego descubrí que era debido a los parámetros incorrectos que estaba pasando. Hubo nullPointerException al obtener el valor de uno de los parámetros. Espero que esto te ayudará.
fuente
fuente
El error desapareció después de que hice Clean-> Run xDoclet-> Run xPackaging.
En mi espacio de trabajo, en ecllipse.
fuente