Č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.