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?

Løsning

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.

Kommentarer (14)

Unntaket kastes hvis

InvocationTargetException - hvis den underliggende metoden kaster et unntak.

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.

Kommentarer (1)

Fra Javadoc for Method.invoke()

Kaster: InvocationTargetException - hvis den underliggende metoden kaster et unntak.

Dette unntaket kastes hvis metoden som ble kalt, kastet et unntak.

Kommentarer (2)