Hva kan forårsake java.lang.reflect.InvocationTargetException?
Vel, jeg har prøvd å forstå og lese hva som kan forårsake det, men jeg kan bare ikke forstå det:
Jeg har dette et sted i koden min:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
Tingen er at når den prøver å påkalle en metode, kaster den
InvocationTargetException
i stedet for noe annet forventet unntak (spesielt ArrayIndexOutOfBoundsException
).
Siden jeg faktisk vet hvilken metode som påkalles, gikk jeg rett til denne metodekoden og la til en try-catch-blokk for linjen som antar å kaste ArrayIndexOutOfBoundsException
, og den kastet virkelig ArrayIndexOutOfBoundsException
som forventet. Men når du går opp det
på en eller annen måte endres til InvocationTargetException
og i koden over catch(Exception e)
e er InvocationTargetException
og ikke ArrayIndexOutOfBoundsException
.
som forventet.
Hva kan forårsake en slik oppførsel, eller hvordan kan jeg sjekke noe slikt?
Du har lagt til et ekstra abstraksjonsnivå ved å kalle metoden med refleksjon. Refleksjonslaget pakker inn ethvert unntak i en
InvocationTargetException
, som lar deg se forskjellen mellom et unntak som faktisk er forårsaket av en feil i refleksjonskallet (kanskje argumentlisten din ikke var gyldig, for eksempel) og en feil i metoden som ble kalt.Bare pakk ut årsaken i
InvocationTargetException
og du kommer til den opprinnelige.Unntaket kastes hvis
Så hvis metoden, som har blitt påkalt med refleksjon API, kaster et unntak (runtime unntak for eksempel), vil refleksjon API vil pakke unntaket i en
InvocationTargetException
.Fra Javadoc for Method.invoke()
Dette unntaket kastes hvis metoden som ble kalt, kastet et unntak.