Eh bien, j'ai essayé de comprendre et de lire ce qui pourrait en être la cause, mais je n'arrive pas à comprendre:
J'ai ceci quelque part dans mon code:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
La chose 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 réellement quelle méthode est invoquée, je suis allé directement à ce code de méthode et j'ai ajouté un bloc try-catch pour la ligne qui suppose de lancer ArrayIndexOutOfBoundsException
et il a vraiment lancé ArrayIndexOutOfBoundsException
comme prévu. Pourtant, en montant, il change en quelque sorte vers InvocationTargetException
et dans le code ci-dessus, catch(Exception e)
e n'est InvocationTargetException
pas ArrayIndexOutOfBoundsException
comme prévu.
Qu'est-ce qui pourrait provoquer un tel comportement ou comment puis-je vérifier une telle chose?
la source
InvocationTargetException
", je viens de découvrir que si vous l'avez imprimé en utilisantexception.printStackTrace()
, vous regardez simplement la section "Causé par:" au lieu de la moitié supérieure / section normale.try {...} catch (InvocationTargetException ex) { log.error("oops!", ex.getCause()) }
ou...catch... { throw ex.getCause() }
you just look at the "Caused By:" section instead of the top half/normal section
L'exception est levée si
Donc, 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
.la source
Utilisez la
getCause()
méthode sur leInvocationTargetException
pour récupérer l'exception d'origine.la source
À partir du Javadoc de Method.invoke ()
Cette exception est levée si la méthode appelée a levé une exception.
la source
java.lang.reflect.Proxy
instances augmentant un objet enveloppé. ChacunProxy
gère gracieusement une exception spécifique (éventuellement levée par l'objet encapsulé) en utilisant la sienneInvocationHandler
. Pour qu'une exception se propage à travers cette cascade jusqu'à atteindre le gestionnaire / proxy d'invocation correct, dans chacunInvocationHandler
, je l'attraperaisInvocationTargetException
, la déballerais, vérifierais si l'exception encapsulée est uneinstanceof
exception à gérer par celaInvocationHandler
. Si ce n'est pas uninstanceof
, je lèverais l' exception déballée ... non?C'est en
InvocationTargetException
train de conclure votreArrayIndexOutOfBoundsException
. Il n'est pas possible de dire dès le départ lors de l'utilisation de la réflexion ce que cette méthode peut apporter - donc plutôt que d'utiliser unethrows Exception
approche, toutes les exceptions sont détectées et intégréesInvocationTargetException
.la source
Cela affichera la ligne de code exacte dans la méthode spécifique qui, lorsqu'elle est invoquée, déclenche l'exception:
la source
Cela décrit quelque chose comme,
la source
Vous pouvez comparer avec la classe d'exception d'origine en utilisant la méthode getCause () comme ceci:
la source
J'ai eu une
java.lang.reflect.InvocationTargetException
erreur provenant d'une instruction appelant un objet logger dans un externeclass
à l' intérieur d'un bloctry
/catch
dans monclass
.En parcourant le code dans le débogueur Eclipse et en passant la souris sur l'instruction de l'enregistreur, j'ai vu que l'enregistreur
object
étaitnull
(certaines constantes externes devaient être instanciées tout en haut de monclass
).la source
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 InvocationTargetException.
la source
J'étais confronté au même problème. J'ai utilisé e.getCause (). GetCause () puis j'ai trouvé que c'était à cause de mauvais paramètres que je passais. Il y avait nullPointerException lors de la récupération de la valeur de l'un des paramètres. J'espère que ceci vous aidera.
la source
la source
L'erreur a disparu après que j'ai fait Clean-> Run xDoclet-> Run xPackaging.
Dans mon espace de travail, en éclipse.
la source