Mikä voi aiheuttaa java.lang.reflect.InvocationTargetExceptionin?

No, olen yrittänyt ymmärtää ja lukea, mikä sen voisi aiheuttaa, mutta en vain ymmärrä sitä:

Minulla on tämä jossain koodissani:

 try{
 ..
 m.invoke(testObject);
 ..
 } catch(AssertionError e){
 ...
 } catch(Exception e){
 ..
 }

Asia on niin, että kun se yrittää kutsua jotain metodia, se heittää... InvocationTargetException jonkin muun odotetun poikkeuksen (erityisesti ArrayIndexOutOfBoundsException) sijasta. Koska tiedän itse asiassa, mitä menetelmää kutsutaan, menin suoraan tähän menetelmäkoodiin ja lisäsin try-catch-lohkon riville, jonka oletetaan heittävän ArrayIndexOutOfBoundsException, ja se todella heitti ArrayIndexOutOfBoundsException odotetusti. Silti, kun se menee ylöspäin, se jotenkin muuttuu InvocationTargetExceptioniksi ja yllä olevassa koodissa catch(Exception e). e on InvocationTargetException eikä ArrayIndexOutOfBoundsException. kuten odotettiin.

Mikä voi aiheuttaa tällaisen käyttäytymisen tai miten voin tarkistaa tällaisen asian?

Ratkaisu

Olet lisännyt ylimääräisen abstraktiotason kutsumalla metodia heijastuksen avulla. Heijastuskerros kietoo kaikki poikkeukset InvocationTargetException -luokkaan, jonka avulla voit erottaa toisistaan poikkeuksen, joka todellisuudessa johtuu heijastuskutsun epäonnistumisesta (esimerkiksi argumenttiluettelo ei ollut kelvollinen), ja kutsutun metodin sisäisen epäonnistumisen.

Purkaa vain syy InvocationTargetException:in sisällä ja pääset alkuperäiseen.

Kommentit (14)

Poikkeus heitetään, jos

InvocationTargetException - jos taustalla oleva menetelmä heittää poikkeuksen.

Jos siis metodi, jota on kutsuttu reflection API:n avulla, heittää poikkeuksen (esimerkiksi ajonaikaisen poikkeuksen), reflection API kietoo poikkeuksen InvocationTargetException -poikkeukseksi.

Kommentit (1)

Metodin Method.invoke() Javadocista

Throws: InvocationTargetException - jos taustalla oleva metodi heittää poikkeuksen.

Tämä poikkeus heitetään, jos kutsuttu metodi heitti poikkeuksen.

Kommentit (2)