Quelles sont les causes de java.lang.reflect.InvocationTargetException?

1. Vue d'ensemble

Lorsque vous travaillez avec l'API Java Reflection, il est courant de rencontrer java.lang.reflect.InvocationTargetException . Dans ce didacticiel, nous allons l'examiner et comment le gérer avec un exemple simple .

2. Cause de l' invocationTargetException

Cela se produit principalement lorsque nous travaillons avec la couche de réflexion et essayons d'appeler une méthode ou un constructeur qui lève une exception sous-jacente.

La couche de réflexion encapsule l'exception réelle levée par la méthode avec InvocationTargetException . Essayons de le comprendre avec un exemple.

Écrivons une classe avec une méthode qui lève intentionnellement une exception:

public class InvocationTargetExample { public int divideByZeroExample() { return 1 / 0; } }

Maintenant, invoquons la méthode ci-dessus en utilisant la réflexion dans un test JUnit 5 simple:

InvocationTargetExample targetExample = new InvocationTargetExample(); Method method = InvocationTargetExample.class.getMethod("divideByZeroExample"); Exception exception = assertThrows(InvocationTargetException.class, () -> method.invoke(targetExample));

Dans le code ci-dessus, nous avons affirmé l' exception InvocationTargetException , qui est levée lors de l'appel de la méthode. Une chose importante à noter ici est que l'exception réelle - ArithmeticException dans ce cas - est enveloppée dans une InvocationTargetException.

Maintenant, la question qui vient à l'esprit est la suivante: pourquoi la réflexion ne lance-t-elle pas en premier lieu l'exception réelle?

La raison en est que cela nous permet de comprendre si l' exception s'est produite en raison d'un échec lors de l'appel de la méthode à travers la couche de réflexion ou si elle s'est produite dans la méthode elle-même.

3. Comment gérer InvocationTargetException ?

Ici, l'exception sous-jacente réelle est la cause d' InvocationTargetException , nous pouvons donc utiliser Throwable.getCause () pour obtenir plus d'informations à ce sujet.

Voyons comment nous pouvons utiliser getCause () pour obtenir l'exception réelle dans le même exemple utilisé ci-dessus:

assertEquals(ArithmeticException.class, exception.getCause().getClass());

Ici, nous avons utilisé la méthode getCause () sur le même objet d' exception qui a été levé. Et nous avons affirmé ArithmeticException.class comme cause de l'exception.

Ainsi, une fois que nous obtenons l'exception sous-jacente, nous pouvons la renvoyer, l'envelopper dans une exception personnalisée ou simplement enregistrer l'exception en fonction de nos besoins.

4. Conclusion

Dans ce court article, nous avons vu comment la couche de réflexion enveloppe toute exception sous-jacente. Nous avons également vu comment déterminer la cause sous-jacente de l' exception InvocationTargetException et comment gérer un tel scénario avec un exemple simple.

Comme d'habitude, le code utilisé dans cet article est disponible à l'adresse over sur GitHub.