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?
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.
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
.
Utilisez la méthode getCause()
sur InvocationTargetException
pour récupérer l'exception d'origine.
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.
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();
}
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
.
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.
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
}
}
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
).
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.
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.