376 Stimmen

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

Ich habe versucht zu verstehen und zu lesen, was die Ursache sein 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 die, dass, wenn es versucht, s aufzurufen InvocationTargetException anstelle einer anderen erwarteten Ausnahme (insbesondere 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 vermutlich auslösen soll ArrayIndexOutOfBoundsException und es warf wirklich ArrayIndexOutOfBoundsException wie erwartet. Wenn jedoch g ändert 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 bzw. wie kann ich so etwas überprüfen?

383voto

Jon Skeet Punkte 1325502

Sie haben eine zusätzliche Abstraktionsebene hinzugefügt, indem Sie die Methode mit Reflection aufgerufen haben. Die Reflection-Schicht verpackt jede Ausnahme in eine InvocationTargetException mit dem Sie den Unterschied zwischen einer Ausnahme eigentlich durch einen Fehler im Reflexionsaufruf (z. B. eine ungültige Argumentenliste) und einen Fehler in der aufgerufenen Methode verursacht.

Packen Sie einfach die Ursache im InvocationTargetException und Sie gelangen zum Original.

60voto

Andreas Dolk Punkte 110776

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), verpackt die Reflection-API die Ausnahme in eine InvocationTargetException .

51voto

Daniel Ward Punkte 491

Verwenden Sie die getCause() Methode auf der InvocationTargetException um die ursprüngliche Ausnahme abzurufen.

24voto

Peter Lawrey Punkte 511323

Aus der Javadoc von Method.invoke()

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

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

14voto

Rocky Inde Punkte 1451

Dadurch wird die genaue Codezeile in der spezifischen Methode ausgegeben, die beim Aufruf die Ausnahme ausgelöst hat:

try {

    // try code
    ..
    m.invoke(testObject);
    ..

} catch (InvocationTargetException e) {

    // Answer:
    e.getCause().printStackTrace();
} catch (Exception e) {

    // generic exception handling
    e.printStackTrace();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X