Qu’est-ce qui pourrait causer une exception java.lang.reflect.InvocationTargetException?

Eh bien, j’ai essayé de comprendre et de lire ce qui pourrait en être la cause, mais je ne peux tout simplement pas le comprendre:

J’ai ceci quelque part dans mon code:

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

La chose est que, quand il essaie d’appeler une méthode, elle lance InvocationTargetException au lieu d’une autre exception attendue (en particulier ArrayIndexOutOfBoundsException ). Comme je sais en fait quelle méthode est invoquée, je suis allé directement sur ce code de méthode et j’ai ajouté un bloc try-catch pour la ligne supposant lancer ArrayIndexOutOfBoundsException et il a vraiment projeté ArrayIndexOutOfBoundsException comme prévu. Pourtant, en remontant, il modifie 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?

Vous avez ajouté un niveau supplémentaire d’abstraction en appelant la méthode avec reflection. Le calque de reflection englobe toute exception dans une exception InvocationTargetException , ce qui vous permet de faire la différence entre une exception réellement provoquée par un échec dans l’appel de reflection (votre liste d’arguments n’est peut-être pas valide, par exemple) et un échec au sein de la méthode.

Déballez simplement la cause dans InvocationTargetException et vous obtiendrez l’original.

L’exception est levée si

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

Donc, si la méthode, qui a été appelée avec une API de reflection, génère une exception (une exception d’exécution par exemple), l’API de reflection encapsule l’exception dans une exception InvocationTargetException .

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

Du Javadoc de Method.invoke ()

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

Cette exception est levée si la méthode appelée a créé une exception.

Cela affichera la ligne de code exacte dans la méthode spécifique qui, une fois appelée, a déclenché l’exception:

 try { // try code .. m.invoke(testObject); .. } catch (InvocationTargetException e) { // Answer: e.getCause().printStackTrace(); } catch (Exception e) { // generic exception handling e.printStackTrace(); } 

Cette ArrayIndexOutOfBoundsException InvocationTargetException est probablement en ArrayIndexOutOfBoundsException votre ArrayIndexOutOfBoundsException . Lors de l’utilisation de la reflection, cette méthode ne permet pas de savoir ce que l’on peut dire – plutôt que d’utiliser une approche d’ throws Exception throws, toutes les exceptions sont interceptées et incluses dans InvocationTargetException .

Cela décrit quelque chose comme,

InvocationTargetException est une exception vérifiée qui encapsule une exception déclenché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 général de chaînage des exceptions. L’exception “cible” fournie au moment de la construction et accessible via la méthode getTargetException () est maintenant connue comme la cause et peut être accessible via la méthode Throwable.getCause (), ainsi que la “méthode héritée” susmentionnée.

Vous pouvez comparer avec la classe d’exception d’origine en utilisant 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 } } 

J’ai eu une erreur java.lang.reflect.InvocationTargetException partir d’une instruction appelant un object logger dans une class externe à l’intérieur d’un bloc try / catch dans ma class .

En parcourant le code dans le débogueur Eclipse et en passant la souris sur la déclaration du logger, j’ai vu que l’ object enregistreur était null (certaines constantes externes devaient être instanciées tout en haut de ma class ).

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

Ainsi, si la méthode, appelée par API de reflection, génère une exception (par exemple une exception d’exécution), l’API de reflection encapsule l’exception dans une exception InvocationTargetException.

Je faisais face au même problème. J’ai utilisé e.getCause (). GetCause () alors j’ai trouvé que c’était à cause de mauvais parameters que je passais. Il y avait nullPointerException en récupérant la valeur de l’un des parameters. J’espère que ceci vous aidera.

  1. Liste tous les fichiers jar du mode Eclipse Navigator
  2. Vérifiez que tous les fichiers jar sont en mode binary

L’erreur a disparu après que j’ai nettoyé-> Exécuter xDoclet-> Exécuter xPackaging.

Dans mon espace de travail, en ecllipse.