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.
L’erreur a disparu après que j’ai nettoyé-> Exécuter xDoclet-> Exécuter xPackaging.
Dans mon espace de travail, en ecllipse.