Was könnte java.lang.reflect.InvocationTargetException verursachen?

Nun, ich habe versucht zu verstehen und zu lesen, was es verursachen könnte, aber ich kann es einfach nicht verstehen:

Ich habe dies 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 wirft InvocationTargetException statt einer anderen erwarteten Ausnahme (nämlich ArrayIndexOutOfBoundsException). Da ich eigentlich weiß, welche Methode aufgerufen wird, bin ich direkt zu diesem Methodencode gegangen und habe einen try-catch-Block für die Zeile hinzugefügt, die ArrayIndexOutOfBoundsException auslösen soll, und es hat wirklich ArrayIndexOutOfBoundsException wie erwartet ausgelöst. Wenn ich jedoch nach oben gehe ändert es sich irgendwie zu InvocationTargetException und in dem 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?

Lösung

Sie haben eine zusätzliche Abstraktionsebene hinzugefügt, indem Sie die Methode mit Reflection aufgerufen haben. Die Reflection-Schicht wickelt jede Ausnahme in eine InvocationTargetException ein, die es Ihnen ermöglicht, zwischen einer Ausnahme, die eigentlich durch einen Fehler im Reflection-Aufruf verursacht wurde (z.B. war Ihre Argumentliste ungültig) und einem Fehler innerhalb der aufgerufenen Methode zu unterscheiden.

Entpacken Sie einfach die Ursache innerhalb der InvocationTargetException und Sie erhalten die ursprüngliche.

Kommentare (14)

Die Ausnahme wird ausgelöst, wenn

InvocationTargetException - wenn die zugrunde liegende Methode eine Ausnahme auslöst.

Wenn also die Methode, die mit der Reflection-API aufgerufen wurde, eine Ausnahme auslöst (z. B. eine Laufzeitausnahme), wird die Reflection-API die Ausnahme in eine "InvocationTargetException" verpacken.

Kommentare (1)

Aus der Javadoc von Method.invoke()

Throws: InvocationTargetException - wenn die zugrunde liegende Methode eine Ausnahme auslöst.

Diese Ausnahme wird ausgelöst, wenn die aufgerufene Methode eine Ausnahme ausgelöst hat.

Kommentare (2)