Lo que podría causar Java.lang.reflejar.Invocaciónexcepción del objetivo?


Bueno, he tratado de entender y leer lo que podría causarlo, pero simplemente 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 InvocationTargetException en lugar de alguna otra excepción esperada (específicamente ArrayIndexOutOfBoundsException). Como en realidad 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 supone lanzar ArrayIndexOutOfBoundsException y realmente lanzó ArrayIndexOutOfBoundsException como se esperaba. Sin embargo, al subir se 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 verificar tal cosa?

Author: Cortex, 2011-05-16

13 answers

Has añadido un nivel extra de abstracción llamando al método con reflexión. La capa de reflexión envuelve cualquier excepción en un InvocationTargetException, lo que le permite distinguir entre una excepción en realidad causada por un error en la llamada de reflexión (tal vez su lista de argumentos no era válida, por ejemplo) y un error dentro del método llamado.

Simplemente desenvuelva la causa dentro del InvocationTargetException y llegará a la original.

 283
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-10 10:13:31

La excepción se lanza si

InvocationTargetException - si el método subyacente arroja una excepción.

Así que 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 un InvocationTargetException.

 40
Author: Andreas_D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-16 17:01:24

Utilice el método getCause() en el InvocationTargetException para recuperar la excepción original.

 36
Author: Daniel Ward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-05 07:15:56

Del Método Javadoc.invoke ()

Lanza: InvocationTargetException - si el método subyacente lanza una excepción.

Esta excepción se lanza si el método llamado lanza una excepción.

 18
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 10:33:09

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();
}
 9
Author: Rocky Inde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-26 11:44:27

Que InvocationTargetException probablemente está terminando su ArrayIndexOutOfBoundsException. No se puede decir por adelantado cuando se usa la reflexión lo que ese método puede arrojar so por lo que en lugar de usar un enfoque throws Exception, todas las excepciones están siendo atrapadas y envueltas en InvocationTargetException.

 8
Author: Liv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-16 17:01:55

Esto describe algo como,

InvocationTargetException es una excepción marcada que excepción lanzada por un método o constructor invocado. A partir del lanzamiento 1.4, esta excepción se ha adaptado para ajustarse al mecanismo de encadenamiento de excepciones de propósito general. La "excepción de destino" que es se proporciona en el momento de la construcción y se accede a través de la El método getTargetException() ahora se conoce como la causa, y puede ser se accede a través del Lanzable.getCause() método, así como el antes mencionado " método heredado."

 2
Author: Sazzad Hissain Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-17 14:12:58

Puedes comparar con la clase de excepción original usando el método getCause() así:

try{
  ...
} catch(Exception e){
   if(e.getCause().getClass().equals(AssertionError.class)){
      // handle your exception  1
   } else {
      // handle the rest of the world exception 
   }
} 
 2
Author: Mehdi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-30 23:49:22

Tuve un error java.lang.reflect.InvocationTargetException de una instrucción que llama a un objeto logger en un class externo dentro de un try / catch bloquear en mi class.

Al pasar por el código en el depurador de Eclipse y pasar el ratón sobre la instrucción logger Vi que el logger object era null (algunas constantes externas necesitaban ser instanciadas en la parte superior de mi class).

 1
Author: Stuart Cardall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-14 09:28:46

Esta excepción se lanza si el método subyacente(método llamado usando Reflexión) lanza una excepción.

Así que si el método, que ha sido invocado por la API de reflexión, lanza una excepción (como por ejemplo la excepción en tiempo de ejecución), la API de reflexión envolverá la excepción en una InvocationTargetException.

 0
Author: Nikhil Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-05 09:16:20

Me enfrentaba al mismo problema. Usé e. getCause ().getCause () entonces descubrí que era debido a parámetros incorrectos que estaba pasando. Hubo NullPointerException al buscar el valor de uno de los parámetros. Espero que esto te ayude.

 0
Author: Deepak Vajpayee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-17 18:10:19
  1. Lista todos los archivos jar del modo Navegador Eclipse
  2. Compruebe que todos los archivos jar están en modo binario
 -2
Author: Manik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-09 08:37:12

El error desapareció después de que lo hice Limpiar- > Ejecutar XDoclet - >Ejecutar xPackaging.

En mi espacio de trabajo, en ecllipse.

 -7
Author: Ashutosh Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-02 13:32:33