web-dev-qa-db-fra.com

Qu'est-ce qui pourrait causer Java.lang.reflect.InvocationTargetException?

Eh bien, j'ai essayé de comprendre et de lire ce qui pouvait le causer mais je n'arrive pas à l'obtenir:

J'ai ceci quelque part dans mon code:

 try{
 ..
 m.invoke(testObject);
 ..
 } catch(AssertionError e){
 ...
 } catch(Exception e){
 ..
 }

Le problème est que, lorsqu'il essaie d'invoquer une méthode, il lève InvocationTargetException au lieu d'une autre exception attendue (en particulier ArrayIndexOutOfBoundsException). Comme je sais en fait quelle méthode est invoquée, je suis passé directement à ce code et ai ajouté un bloc try-catch pour la ligne supposant de lancer ArrayIndexOutOfBoundsException et qui a réellement jeté ArrayIndexOutOfBoundsException comme prévu. Pourtant, en montant, il devient en quelque sorte InvocationTargetException et dans le code ci-dessus catch(Exception e) e est InvocationTargetException et non ArrayIndexOutOfBoundsException comme prévu.

Qu'est-ce qui pourrait causer un tel comportement ou comment puis-je vérifier une telle chose?

294
user550413

Vous avez ajouté un niveau supplémentaire d'abstraction en appelant la méthode avec réflexion. La couche de réflexion enveloppe toute exception dans un InvocationTargetException, ce qui vous permet de faire la différence entre une exception en fait causée par un échec de l'appel de réflexion (peut-être que votre liste d'arguments n'était pas valide, car exemple) et un échec dans la méthode appelée.

Décompressez simplement la cause dans la InvocationTargetException et vous obtiendrez celle d'origine.

311
Jon Skeet

L'exception est levée si

InvocationTargetException - si la méthode sous-jacente lève une exception.

Ainsi, si la méthode qui a été invoquée avec l'API de réflexion lève une exception (exception d'exécution par exemple), l'API de réflexion encapsulera l'exception dans un InvocationTargetException.

45
Andreas_D

Utilisez la méthode getCause() sur InvocationTargetException pour récupérer l'exception d'origine.

43
Daniel Ward

De la Javadoc de Method.invoke ()

Lève: InvocationTargetException - si la méthode sous-jacente lève une exception.

Cette exception est levée si la méthode appelée lève une exception.

21
Peter Lawrey

Cela affichera la ligne de code exacte dans la méthode spécifique qui, lorsqu'elle est appelée, déclenche l'exception:

try {

    // try code
    ..
    m.invoke(testObject);
    ..

} catch (InvocationTargetException e) {

    // Answer:
    e.getCause().printStackTrace();
} catch (Exception e) {

    // generic exception handling
    e.printStackTrace();
}
9
Rocky Inde

Cette InvocationTargetException est probablement en train de terminer votre ArrayIndexOutOfBoundsException. Il n'y a pas d'avance en matière d'utilisation de la réflexion sur ce que cette méthode peut générer - donc plutôt que d'utiliser une approche throws Exception, toutes les exceptions sont capturées et résumées dans InvocationTargetException.

9
Liv

This décrit quelque chose comme,

InvocationTargetException est une exception vérifiée qui encapsule une exception levée par une méthode ou un constructeur appelé. À partir de la version 1.4, cette exception a été modifiée pour se conformer au mécanisme de chaînage des exceptions à usage général. L'exception "cible" fournie au moment de la construction et accessible via la méthode getTargetException () est désormais appelée cause et peut être accessible via la méthode Throwable.getCause (), ainsi que la "méthode héritée" susmentionnée.

3
Sazzad Hissain Khan

Vous pouvez comparer avec la classe d'exception originale à l'aide de la méthode getCause () comme ceci:

try{
  ...
} catch(Exception e){
   if(e.getCause().getClass().equals(AssertionError.class)){
      // handle your exception  1
   } else {
      // handle the rest of the world exception 
   }
} 
1
Mehdi

J'ai eu une erreur Java.lang.reflect.InvocationTargetException d'une instruction appelant un objet enregistreur dans un class externe à l'intérieur d'un bloc try/catch dans mon class.

En parcourant le code dans le débogueur Eclipse et en survolant la déclaration du consignateur avec la souris, j'ai vu le consignateur object était null (certaines constantes externes devaient être instanciées tout en haut de ma class ).

1
Stuart Cardall

Cette exception est levée si la méthode sous-jacente (méthode appelée à l'aide de Reflection) lève une exception.

Ainsi, si la méthode, qui a été invoquée par l'API de réflexion, lève une exception (comme par exemple une exception d'exécution), l'API de réflexion encapsulera l'exception dans une exception InvocationTargetException.

0
Nikhil Kumar

Je faisais face au même problème. J'ai utilisé e.getCause (). GetCause (), puis j'ai découvert que c'était en raison de paramètres erronés que je passais. Il y avait nullPointerException dans l'extraction de la valeur de l'un des paramètres. J'espère que cela vous aidera.

0
Deepak Vajpayee