Nun, ich habe versucht zu verstehen und zu lesen, was es verursachen könnte, aber ich kann es einfach nicht verstehen:
Ich habe das irgendwo in meinem Code:
try{
..
m.invoke(testObject);
..
} catch(AssertionError e){
...
} catch(Exception e){
..
}
Die Sache ist, dass, wenn es versucht, eine Methode aufzurufen, es
InvocationTargetException
anstelle einer anderen erwarteten Ausnahme (speziell ArrayIndexOutOfBoundsException
) auslöst . Da ich tatsächlich weiß, welche Methode aufgerufen wird, ging ich direkt zu diesem Methodencode und fügte einen Try-Catch-Block für die Zeile hinzu, die geworfen werden soll, ArrayIndexOutOfBoundsException
und er warf wirklich ArrayIndexOutOfBoundsException
wie erwartet. Doch wenn es hochgeht, ändert es sich irgendwie zu InvocationTargetException
und im obigen Code. catch(Exception e)
E ist InvocationTargetException
und nicht ArrayIndexOutOfBoundsException
wie erwartet.
Was könnte ein solches Verhalten verursachen oder wie kann ich so etwas überprüfen?
quelle
InvocationTargetException
", habe ich gerade festgestellt, dass Sie, wenn Sie es mit drucken lassenexception.printStackTrace()
, nur den Abschnitt "Verursacht durch:" anstelle der oberen Hälfte / des normalen Abschnitts betrachten.try {...} catch (InvocationTargetException ex) { log.error("oops!", ex.getCause()) }
oder...catch... { throw ex.getCause() }
you just look at the "Caused By:" section instead of the top half/normal section
Die Ausnahme wird ausgelöst, wenn
Wenn also die Methode, die mit der Reflection-API aufgerufen wurde, eine Ausnahme auslöst (z. B. Laufzeitausnahme), wird die Exception von der Reflection-API in eine eingeschlossen
InvocationTargetException
.quelle
Verwenden Sie die
getCause()
Methode aufInvocationTargetException
, um die ursprüngliche Ausnahme abzurufen.quelle
Aus dem Javadoc von Method.invoke ()
Diese Ausnahme wird ausgelöst, wenn die aufgerufene Methode eine Ausnahme ausgelöst hat.
quelle
java.lang.reflect.Proxy
Instanzen, die ein verpacktes Objekt erweitern. JederProxy
behandelt eine bestimmte Ausnahme (möglicherweise vom umschlossenen Objekt ausgelöst) ordnungsgemäß, indem er seine eigene verwendetInvocationHandler
. Damit eine Ausnahme diese Kaskade durchläuft, bis der richtige Aufrufhandler / Proxy erreicht istInvocationHandler
, würde ich sie abfangenInvocationTargetException
, auspacken und prüfen, ob die umschlossene Ausnahmeinstanceof
die Ausnahme ist, die von dieser behandelt wirdInvocationHandler
. Wenn es keine istinstanceof
, würde ich die ausgepackte Ausnahme auslösen ... richtig?Das
InvocationTargetException
ist wahrscheinlich Ihr AbschlussArrayIndexOutOfBoundsException
. Bei der Verwendung von Reflexion lässt sich nicht im Voraus sagen, was diese Methode bewirken kann. Anstatt einenthrows Exception
Ansatz zu verwenden, werden alle Ausnahmen abgefangen und eingepacktInvocationTargetException
.quelle
Dadurch wird die genaue Codezeile in der spezifischen Methode gedruckt, die beim Aufrufen die Ausnahme auslöste:
quelle
Dies beschreibt so etwas wie
quelle
Sie können mit der ursprünglichen Ausnahmeklasse mit der folgenden Methode getCause () vergleichen:
quelle
Ich hatte einen
java.lang.reflect.InvocationTargetException
Fehler von einer Anweisung, die ein Logger-Objekt in einem externenclass
innerhalb einestry
/catch
Blocks in meinem aufriefclass
.Schreiten durch den Code in den Eclipse - Debugger und schwebt mit der Maus über die Logger Aussage , die ich den Logger sah
object
warnull
(einige benötigten externen Konstanten an der Spitze meines instanziiert werdenclass
).quelle
Diese Ausnahme wird ausgelöst, wenn die zugrunde liegende Methode (Methode, die mit Reflection aufgerufen wird) eine Ausnahme auslöst.
Wenn also die von der Reflection-API aufgerufene Methode eine Ausnahme auslöst (z. B. Laufzeitausnahme), wird die Exception von der Reflection-API in eine InvocationTargetException eingeschlossen.
quelle
Ich hatte das gleiche Problem. Ich habe e.getCause (). GetCause () verwendet und dann festgestellt, dass dies auf falsche Parameter zurückzuführen ist, die ich übergeben habe. Beim Abrufen des Werts eines der Parameter gab es eine nullPointerException. Hoffe das wird dir helfen.
quelle
quelle
Der Fehler verschwand, nachdem ich Clean-> Run xDoclet-> Run xPackaging ausgeführt hatte.
In meinem Arbeitsbereich, in Ecllipse.
quelle