solucion - ¿Qué podría causar java.lang.reflect.InvocationTargetException?
java.lang.reflect.invocationtargetexception solucion (13)
Bueno, he tratado de entender y leer lo que podría causarlo, pero simplemente no puedo entenderlo:
Tengo esto en alguna parte 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 la 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 añadí un bloque try-catch para la línea que supone lanzar la ArrayIndexOutOfBoundsException
y realmente lanzó la ArrayIndexOutOfBoundsException
como se esperaba. Sin embargo, al subir, cambia de alguna manera 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 verificar tal cosa?
- Listar todos los archivos jar desde el modo Eclipse Navigator
- Verifica que todos los archivos jar estén en modo binario.
Desde el Javadoc de Method.invoke ()
Emite: InvocationTargetException - si el método subyacente lanza una excepción.
Esta excepción se lanza si el método llamado lanzó una excepción.
El error desapareció después de que hice Limpiar-> Ejecutar xDoclet-> Ejecutar xPackaging.
En mi espacio de trabajo, en ecllipse.
Esa InvocationTargetException
probablemente esté envolviendo su ArrayIndexOutOfBoundsException
. No se puede decir por adelantado cuando se usa la reflexión lo que ese método puede lanzar, así que en lugar de usar un enfoque de throws Exception
, todas las excepciones se detectan y envuelven en InvocationTargetException
.
Esta excepción se lanza si el método subyacente (método llamado usar Reflexión) lanza una excepción.
Entonces, si el método, que ha sido invocado por la API de reflexión, lanza 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 InvocationTargetException
Estaba enfrentando el mismo problema. Utilicé e.getCause (). GetCause () luego descubrí que era debido a parámetros incorrectos que estaba pasando. Hubo nullPointerException al obtener el valor de uno de los parámetros. Espero que esto te ayudará.
Esto imprimirá la línea exacta de código en el método específico, que cuando se invoca, genera la excepción:
try {
// try code
..
m.invoke(testObject);
..
} catch (InvocationTargetException e) {
// Answer:
e.getCause().printStackTrace();
} catch (Exception e) {
// generic exception handling
e.printStackTrace();
}
Has agregado un nivel adicional de abstracción al llamar al método con reflexión. La capa de reflexión ajusta cualquier excepción en una excepción InvocationTargetException
, que le permite determinar la diferencia entre una excepción realmente causada por una falla en la llamada de reflexión (tal vez su lista de argumentos no era válida, por ejemplo) y una falla en el método llamado.
Simplemente desenvuelva la causa dentro de la InvocationTargetException
y obtendrá la original.
La excepción es lanzada si
InvocationTargetException: si el método subyacente lanza una excepción.
Entonces, si el método, que se ha invocado con la API de reflexión, lanza una excepción (excepción de tiempo de ejecución, por ejemplo), la API de reflexión envolverá la excepción en una InvocationTargetException
.
Puedes comparar con la clase de excepción original usando el método getCause () como este:
try{
...
} catch(Exception e){
if(e.getCause().getClass().equals(AssertionError.class)){
// handle your exception 1
} else {
// handle the rest of the world exception
}
}
Recibí un error java.lang.reflect.InvocationTargetException
de una declaración que llama a un objeto registrador en una class
externa dentro de un bloque try
/ catch
en mi class
.
Al pasar por el código en el depurador Eclipse y pasar el mouse sobre la declaración del registrador, vi que el object
del registrador era null
(algunas constantes externas debían ser instanciadas en la parte superior de mi class
).
Utilice el método getCause()
en la excepción InvocationTargetException
para recuperar la excepción original.
This describe algo como
La excepción InvocationTargetException es una excepción comprobada que envuelve una excepción lanzada por un método o constructor invocado. A partir de la versión 1.4, esta excepción se ha modificado para cumplir con el mecanismo de encadenamiento de excepciones de propósito general. La "excepción de destino" que se proporciona en el momento de la construcción y que se accede a través del método getTargetException () ahora se conoce como la causa, y se puede acceder a ella a través del método Throwable.getCause (), así como al "método heredado" mencionado anteriormente.