Snažil som sa pochopiť a prečítať si, čo by to mohlo spôsobiť, ale jednoducho to nedokážem pochopiť:
Mám to niekde vo svojom kóde:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
Ide o to, že keď sa pokúsi zavolať nejakú metódu, vyhodí to
InvocationTargetException
namiesto nejakej inej očakávanej výnimky (konkrétne ArrayIndexOutOfBoundsException
).
Keďže v skutočnosti viem, aká metóda sa volá, išiel som priamo do kódu tejto metódy a pridal som try-catch blok pre riadok, ktorý má vyhodiť ArrayIndexOutOfBoundsException
a naozaj to vyhodilo ArrayIndexOutOfBoundsException
podľa očakávania. Napriek tomu pri prechode nahor to
nejako zmení na InvocationTargetException
a v kóde vyššie catch(Exception e)
e je InvocationTargetException
a nie ArrayIndexOutOfBoundsException
ako sa očakávalo.
Čo by mohlo spôsobiť takéto správanie alebo ako môžem takúto vec skontrolovať?
Volaním metódy s reflexiou ste pridali ďalšiu úroveň abstrakcie. Vrstva reflexie zabalí akúkoľvek výnimku do InvocationTargetException
, čo vám umožní rozlíšiť výnimku skutočne spôsobenú chybou vo volaní reflexie (napríklad váš zoznam argumentov nebol platný) od chyby vo volanej metóde.
Stačí rozbaliť príčinu v rámci InvocationTargetException
a dostanete sa k pôvodnej.
Výnimka sa vyhodí, ak
InvocationTargetException - ak základná metóda vyhodí výnimku.
Ak teda metóda, ktorá bola vyvolaná pomocou reflection API, vyhodí výnimku (napríklad runtime výnimku), reflection API túto výnimku zabalí do InvocationTargetException
.
Z Javadocu metódy Method.invoke()
Vyhodí: InvocationTargetException - ak základná metóda vyhodí výnimku.
Táto výnimka sa vyhodí, ak volaná metóda hodila výnimku.