Wat zijn de oorzaken java.lang.reflect.InvocationTargetException?

1. Overzicht

Bij het werken met Java Reflection API, is het gebruikelijk om tegen te komen java.lang.reflect.InvocationTargetException. In deze zelfstudie zullen we deze bekijken en met een eenvoudig voorbeeld bekijken hoe u ermee om kunt gaan.

2. Oorzaak van InvocationTargetException

Het komt voornamelijk voor wanneer we met de reflectielaag werken en proberen een methode of constructor aan te roepen die zelf een onderliggende uitzondering genereert.

De reflectielaag omhult de feitelijke uitzondering die door de methode wordt gegenereerd met de InvocationTargetException. Laten we het proberen te begrijpen met een voorbeeld.

Laten we een klasse schrijven met een methode die opzettelijk een uitzondering genereert:

openbare klasse InvocationTargetExample {openbare int divideByZeroExample () {return 1/0; }}

Laten we nu de bovenstaande methode gebruiken met behulp van reflectie in een Simple JUnit 5-test:

InvocationTargetExample targetExample = nieuwe InvocationTargetExample (); Method method = InvocationTargetExample.class.getMethod ("divideByZeroExample"); Uitzonderingsuitzondering = assertThrows (InvocationTargetException.class, () -> method.invoke (targetExample));

In de bovenstaande code hebben we de InvocationTargetException, die wordt gegenereerd tijdens het aanroepen van de methode. Een belangrijk ding om hier op te merken is dat de feitelijke uitzondering - ArithmeticException in dit geval - wordt verpakt in een InvocationTargetException.

Nu, de vraag die bij me opkomt is: waarom werpt reflectie niet in de eerste plaats de feitelijke uitzondering op?

De reden is dat het ons in staat stelt te begrijpen of de Uitzondering is opgetreden als gevolg van het niet aanroepen van de methode door de reflectielaag of doordat het binnen de methode zelf is opgetreden.

3. Hoe te behandelen InvocationTargetException?

Hier is de feitelijke onderliggende uitzondering de oorzaak van InvocationTargetException, dus we kunnen gebruik Throwable.getCause () om er meer informatie over te krijgen.

Laten we eens kijken hoe we kunnen gebruiken getCause () om de daadwerkelijke uitzondering te krijgen in hetzelfde voorbeeld dat hierboven is gebruikt:

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

Hier hebben we de getCause () methode op hetzelfde uitzondering object dat werd gegooid. En we hebben beweerd ArithmeticException.class als oorzaak van de uitzondering.

Dus zodra we de onderliggende uitzondering hebben, kunnen we dezelfde opnieuw gooien, deze in een aangepaste uitzondering plaatsen of de uitzondering eenvoudigweg loggen op basis van onze vereiste.

4. Conclusie

In dit korte artikel hebben we gezien hoe de reflectielaag elke onderliggende uitzondering omhult. We hebben ook gezien hoe we de onderliggende oorzaak van de InvocationTargetException en hoe met een dergelijk scenario om te gaan met een eenvoudig voorbeeld.

Zoals gewoonlijk is de code die in dit artikel wordt gebruikt, beschikbaar op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found