Beh, ho cercato di capire e leggere cosa potrebbe causarlo ma non riesco a capirlo:
Ho questo da qualche parte nel mio codice:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
Il fatto è che, quando cerca di invocare qualche metodo, lancia
InvocationTargetException
invece di qualche altra eccezione prevista (in particolare ArrayIndexOutOfBoundsException
).
Siccome so effettivamente quale metodo viene invocato, sono andato direttamente al codice di questo metodo e ho aggiunto un blocco try-catch per la linea che dovrebbe lanciare ArrayIndexOutOfBoundsException
e ha davvero lanciato ArrayIndexOutOfBoundsException
come previsto. Tuttavia, quando si sale
in qualche modo cambia in InvocationTargetException
e nel codice sopra catch(Exception e)
e è InvocationTargetException
e non ArrayIndexOutOfBoundsException
.
come previsto.
Cosa potrebbe causare un tale comportamento o come posso controllare una cosa del genere?
Hai aggiunto un ulteriore livello di astrazione chiamando il metodo con reflection. Il livello di riflessione avvolge qualsiasi eccezione in una InvocationTargetException
, che ti permette di dire la differenza tra un'eccezione attualmente causata da un fallimento nella chiamata di riflessione (forse la tua lista di argomenti non era valida, per esempio) e un fallimento all'interno del metodo chiamato.
Basta scartare la causa all'interno della InvocationTargetException
e si arriva a quella originale.
L'eccezione viene lanciata se
InvocationTargetException - se il metodo sottostante lancia un'eccezione.
Quindi se il metodo, che è stato invocato con l'API reflection, lancia un'eccezione (eccezione di runtime per esempio), l'API reflection avvolgerà l'eccezione in una InvocationTargetException
.
Dal Javadoc di Method.invoke()
Throws: InvocationTargetException - se il metodo sottostante lancia un'eccezione.
Questa eccezione viene lanciata se il metodo chiamato ha lanciato un'eccezione.