305 votes

Ce qui pourrait causer java.lang.reflect.InvocationTargetException ?

Eh bien, j'ai essayé de comprendre et de lire ce qui a pu provoquer, mais je ne peux pas le faire:

J'ai quelque part dans mon code ce:

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

C'est que, lorsqu'il tente d'invoquer une méthode jette InvocationTargetException à la place d'une autre exception (plus précisément ArrayIndexOutOfBoundsException). Comme je l'ai fait savoir quelle méthode est invoquée, je suis allé directement à ce code de la méthode et de l'ajout d'un bloc try-catch pour la ligne qui suppose de jeter ArrayIndexOutOfBoundsException et il a vraiment jeté ArrayIndexOutOfBoundsException comme prévu. Pourtant, quand il d'une certaine manière les changements d' InvocationTargetException et dans le code ci-dessus catch(Exception e) e est - InvocationTargetException et pas ArrayIndexOutOfBoundsException comme prévu.

Ce qui a pu provoquer un tel comportement ou comment puis-je vérifier une telle chose?

328voto

Jon Skeet Points 692016

Vous avez ajouté un niveau supplémentaire d’abstraction en appelant la méthode par réflexion. La couche de réflexion encapsule les exceptions dans un `` , qui vous permet d’indiquer la différence entre une exception en fait causé par une défaillance dans l’appel de réflexion (peut-être que votre liste d’arguments n’est pas valide, par exemple) et une défaillance de la méthode appelée.

Juste déballer la cause au sein de la `` et vous aurez la chance de celui d’origine.

50voto

Andreas_D Points 64111

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é invoquée avec l’API de réflexion, lève une exception (exception runtime par exemple), l’API de réflexion se terminera l’exception dans un `` .

44voto

Daniel Ward Points 141

Utilisation du méthode sur le pour récupérer l’exception d’origine.

21voto

Peter Lawrey Points 229686

De la Javadoc de Method.invoke()

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

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

9voto

Liv Points 2993

Que est probablement envelopper votre . On ne sait pas dès le départ lors de l’utilisation de réflexion ce que cette méthode peut lever--alors plutôt que d’utiliser un approche, toutes les exceptions sont étant capturés et enveloppé dans .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X