it-swarm.com.de

Was kann zu Java.lang.reflect.InvocationTargetException führen?

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?

294
user550413

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.

311
Jon Skeet

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.

45
Andreas_D

Verwenden Sie die Methode getCause() für InvocationTargetException, um die ursprüngliche Ausnahme abzurufen.

43
Daniel Ward

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.

21
Peter Lawrey

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();
}
9
Rocky Inde

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.

9
Liv

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.

3

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 
   }
} 
1
Mehdi

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. ).

1
Stuart Cardall

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.

0
Nikhil Kumar

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.

0
Deepak Vajpayee