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?
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.
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.
Metodin Method.invoke() Javadocista
Throws: InvocationTargetException - jos taustalla oleva metodi heittää poikkeuksen.
Tämä poikkeus heitetään, jos kutsuttu metodi heitti poikkeuksen.