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){
..
}
Wenn versucht wird, eine Methode aufzurufen, wird InvocationTargetException
anstelle einer anderen erwarteten Ausnahme (speziell ArrayIndexOutOfBoundsException
) ausgelö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 ArrayIndexOutOfBoundsException
auslösen sollte, und es warf ArrayIndexOutOfBoundsException
wie erwartet. Doch wenn es hochgeht, ändert es sich irgendwie in InvocationTargetException
und im obigen Code catch(Exception e)
ist e InvocationTargetException
und nicht ArrayIndexOutOfBoundsException
wie erwartet.
Was könnte ein solches Verhalten verursachen oder wie kann ich so etwas überprüfen?
Sie haben eine zusätzliche Abstraktionsebene hinzugefügt, indem Sie die Methode mit Reflection aufgerufen haben. Die Reflection-Ebene umschließt jede Ausnahme mit einem InvocationTargetException
, mit dem Sie den Unterschied zwischen einer Ausnahme tatsächlich feststellen können, die durch einen Fehler beim Reflection-Aufruf verursacht wurde (möglicherweise war Ihre Argumentliste nicht gültig, z Beispiel) und ein Fehler innerhalb der aufgerufenen Methode.
Packen Sie einfach die Ursache in InvocationTargetException
aus, und Sie gelangen zum Original.
Die Ausnahme wird ausgelöst, wenn
InvocationTargetException - wenn die zugrunde liegende Methode eine Ausnahme auslöst.
Wenn die mit der Reflection-API aufgerufene Methode eine Ausnahme auslöst (beispielsweise eine Laufzeitausnahme), wird die Ausnahme von der Reflection-API in ein InvocationTargetException
eingeschlossen.
Verwenden Sie die Methode getCause()
für InvocationTargetException
, um die ursprüngliche Ausnahme abzurufen.
Aus dem Javadoc von Method.invoke ()
Löst aus: InvocationTargetException - wenn die zugrunde liegende Methode eine Ausnahme auslöst.
Diese Ausnahme wird ausgelöst, wenn die aufgerufene Methode eine Ausnahme ausgelöst hat.
Dies gibt die genaue Codezeile in der spezifischen Methode aus, die beim Aufrufen die Ausnahme auslöste:
try {
// try code
..
m.invoke(testObject);
..
} catch (InvocationTargetException e) {
// Answer:
e.getCause().printStackTrace();
} catch (Exception e) {
// generic exception handling
e.printStackTrace();
}
Dieses InvocationTargetException
schließt wahrscheinlich Ihr ArrayIndexOutOfBoundsException
ab. Es ist nicht klar, was diese Methode bewirken kann, wenn Reflektion verwendet wird. Anstatt also einen throws Exception
-Ansatz zu verwenden, werden alle Ausnahmen abgefangen und in InvocationTargetException
eingeschlossen.
This beschreibt so etwas wie,
InvocationTargetException ist eine aktivierte Ausnahme, die eine von einer aufgerufenen Methode oder einem aufgerufenen Konstruktor ausgelöste Ausnahme umschließt. Ab Version 1.4 wurde diese Ausnahme so nachgerüstet, dass sie dem allgemeinen Mechanismus zur Verkettung von Ausnahmen entspricht. Die "Zielausnahme", die zur Erstellungszeit bereitgestellt wird und auf die über die getTargetException () -Methode zugegriffen wird, wird jetzt als Ursache bezeichnet und kann über die Throwable.getCause () -Methode sowie über die oben genannte "Legacy-Methode" aufgerufen werden.
Sie können mit der Methode getCause () wie folgt mit der ursprünglichen Ausnahmeklasse vergleichen:
try{
...
} catch(Exception e){
if(e.getCause().getClass().equals(AssertionError.class)){
// handle your exception 1
} else {
// handle the rest of the world exception
}
}
Ich hatte einen Java.lang.reflect.InvocationTargetException
Fehler von einer Anweisung, die ein Logger-Objekt in einem externen class
innerhalb eines try
/catch
Blocks in meinem class
aufrief.
Beim Durchlaufen des Codes im Eclipse-Debugger und Bewegen der Maus über die Logger-Anweisung wurde der Logger object
als null
angezeigt (einige externe Konstanten mussten ganz oben in meinem class
instanziiert werden. ).
Diese Ausnahme wird ausgelöst, wenn die zugrunde liegende Methode (mit Reflection aufgerufene Methode) eine Ausnahme auslöst.
Wenn die von der Reflection-API aufgerufene Methode eine Ausnahme auslöst (z. B. eine Laufzeitausnahme), wird die Ausnahme von der Reflection-API in eine InvocationTargetException eingeschlossen.
Ich hatte das gleiche Problem. Ich habe e.getCause (). GetCause () verwendet und dann festgestellt, dass es an falschen Parametern lag, die ich übergeben habe. Beim Abrufen des Werts eines der Parameter ist eine nullPointerException aufgetreten. Hoffe das wird dir helfen.