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?

11voto

Liv Punkte 5916

Das InvocationTargetException ist wahrscheinlich das Einpacken Ihrer ArrayIndexOutOfBoundsException . Bei der Verwendung von Reflection kann man nicht im Voraus sagen, was diese Methode auslösen kann - daher ist es besser, eine throws Exception Ansatz werden alle Ausnahmen abgefangen und in InvocationTargetException .

4voto

Sazzad Hissain Khan Punkte 33230

Diese beschreibt so etwas wie,

InvocationTargetException ist eine geprüfte Ausnahme Ausnahme, die von einer aufgerufenen Methode oder einem Konstruktor ausgelöst wird. Ab der Version 1.4 wurde diese Ausnahme nachgerüstet, um mit dem allgemeinen Mechanismus zur Verkettung von Ausnahmen übereinzustimmen. Die "Ziel-Ausnahme", die die zur Konstruktionszeit bereitgestellt wird und auf die über die getTargetException() Methode zugegriffen wird, ist nun als Ursache bekannt und kann Throwable.getCause()-Methode zugegriffen werden, ebenso wie über die oben erwähnte "Legacy-Methode".

2voto

Mehdi Punkte 1167

Sie können mit der ursprünglichen Ausnahmeklasse vergleichen, indem Sie die Methode getCause() wie folgt verwenden:

try{
  ...
} catch(Exception e){
   if(e.getCause().getClass().equals(AssertionError.class)){
      // handle your exception  1
   } else {
      // handle the rest of the world exception 
   }
}

1voto

Stuart Cardall Punkte 1733

Ich hatte eine java.lang.reflect.InvocationTargetException Fehler von einer Anweisung, die ein Logger-Objekt in einem externen class innerhalb einer try / catch Block in meinem class .

Wenn ich im Eclipse-Debugger durch den Code gehe und den Mauszeiger über die Logger-Anweisung bewege, sehe ich den Logger object war null (einige externe Konstanten mussten ganz oben in meiner Datenbank instanziiert werden. class ).

1voto

jobbert Punkte 3077

Ein Problem kann auch sein, dass die targetSdkVersion zu hoch ist und dass Sie veraltete Gradle-Manifestfunktionen verwenden. Versuchen Sie, die targetSdkVersion wieder zu senken und sehen Sie, ob es funktioniert. In meinem Fall war es targetSdkVersion 31 -> 30

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