Čo spôsobuje java.lang.reflect.InvocationTargetException?

1. Prehľad

Pri práci s rozhraním Java Reflection API sa môžete bežne stretnúť java.lang.reflect.InvocationTargetException. V tomto tutoriáli sa na to pozrieme a na jednoduchom príklade, ako to zvládnuť.

2. Príčina InvocationTargetException

Vyskytuje sa to hlavne vtedy, keď pracujeme s reflexnou vrstvou a pokúšame sa vyvolať metódu alebo konštruktor, ktorý vrhá samotnú základnú výnimku.

Odrazová vrstva obaluje skutočnú výnimku vyvolanú metódou s InvocationTargetException. Skúsme to pochopiť na príklade.

Poďme napísať triedu metódou, ktorá zámerne vyvolá výnimku:

verejná trieda InvocationTargetExample {public int divideByZeroExample () {návrat 1/0; }}

Teraz vyvolajme vyššie uvedenú metódu pomocou odrazu v teste Simple JUnit 5:

InvocationTargetExample targetExample = nový InvocationTargetExample (); Metóda method = InvocationTargetExample.class.getMethod ("divideByZeroExample"); Výnimka výnimka = assertThrows (InvocationTargetException.class, () -> method.invoke (targetExample));

Vo vyššie uvedenom kóde sme tvrdili InvocationTargetException, ktorá je vyvolaná pri vyvolaní metódy. Tu je dôležité poznamenať, že skutočná výnimka - Aritmetická výnimka v tomto prípade - sa zabalí do InvocationTargetException.

Teraz mi príde na myseľ otázka, prečo na prvý pohľad neodhodí odraz skutočnú výnimku?

Dôvod je ten, že nám umožňuje pochopiť, či Výnimka došlo z dôvodu zlyhania volania metódy cez reflexnú vrstvu alebo toho, či k nej došlo v rámci samotnej metódy.

3. Ako zaobchádzať InvocationTargetException?

Tu je skutočná základná výnimka príčinou InvocationTargetException, takže môžeme použitie Throwable.getCause () získať o tom viac informácií.

Pozrime sa, ako môžeme využiť getCause () získať skutočnú výnimku v rovnakom príklade použitom vyššie:

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

Tu sme použili getCause () metóda na rovnakom výnimkou predmet, ktorý bol hodený. A my sme tvrdili ArithmeticException.class ako príčina výnimky.

Takže akonáhle dostaneme základnú výnimku, môžeme ju znova vyhodiť, zabaliť do nejakej vlastnej výnimky alebo jednoducho výnimku prihlásiť na základe našej požiadavky.

4. Záver

V tomto krátkom článku sme videli, ako reflexná vrstva obaluje všetky základné výnimky. Tiež sme videli, ako určiť základnú príčinu InvocationTargetException a ako zvládnuť takýto scenár na jednoduchom príklade.

Ako obvykle je kód použitý v tomto článku k dispozícii na GitHub.


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