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

Eh bien, j'ai essayé de comprendre et de lire ce qui pourrait en être la cause, mais je n'y arrive pas :

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 jette InvocationTargetException au lieu d'une autre exception attendue (spécifiquement ArrayIndexOutOfBoundsException). Comme je sais quelle méthode est invoquée, je suis allé directement au code de cette méthode et j'ai ajouté un bloc try-catch pour la ligne qui est supposée lancer ArrayIndexOutOfBoundsException et il a vraiment lancé ArrayIndexOutOfBoundsException comme prévu. Pourtant, en remontant, il d'une manière ou d'une autre, elle devient 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 ?

Solution

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

Il suffit de déballer la cause dans l'exception InvocationTargetException pour retrouver l'exception originale.

Commentaires (14)

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 transformera l'exception en une InvocationTargetException.

Commentaires (1)

Extrait de la Javadoc de Method.invoke()

; Renvoie : 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.

Commentaires (2)