com.sun.jdi.InvocationException ist beim Aufrufen der Methode aufgetreten

75

Ich möchte nur ein Objekt der Klasse erstellen, habe diesen Fehler jedoch beim Debuggen erhalten. Kann mir jemand sagen, wo das Problem liegt? Der Speicherort dieses Codes befindet sich in einer Spring (2.5) Service-Klasse.

Es gibt ein ähnliches Problem: OJB Reference Descriptor 1: 0-Beziehung? Sollte ich Auto-Retrieve auf false setzen?

Vielen Dank ~

xyy
quelle
3
Es ist schwer zu erraten, was Ihr Problem ist, ohne Quellcode oder Stack-Trace.
Jim Garrison
8
Ich habe es herausgefunden, die toString () -Methode der Klasse kann eine NullPointerException auslösen, wenn sie aufgerufen wird. Wenn ich sie korrigiere, ist der Fehler verschwunden, aber ich weiß nicht, wie das passiert ist.
xyy
3
Gute Arbeit xyz. Können Sie bitte selbst eine Antwort auf die Frage posten und diese Antwort dann akzeptieren, damit wir diese Frage schließen können? Außerdem müssen Sie Antworten auf frühere Fragen akzeptieren, wenn diese Ihr Problem beheben.
Zecas

Antworten:

90

Die Hauptursache ist, dass beim Debuggen der Java-Debug-Schnittstelle toString () Ihrer Klasse aufgerufen wird, um die Klasseninformationen im Popup-Feld anzuzeigen. Wenn die toString-Methode also nicht richtig definiert ist, kann dies passieren.

Frank
quelle
1
Was ist, wenn die toString-Methode überhaupt nicht definiert ist? Ich bekomme es in der RestTemplate-Klasse des Spring-JAR, das ist eine der Kernklassen, und es hat keine toString () -Methode. Trotzdem erhalte ich diese Ausnahme von einer anderen Klasse, in der ich RestTemplate.getForObject () aufrufe. Ich habe keine Ahnung, was passiert.
Saurabh Patil
1
@SaurabhPatil toStringwird immer definiert, wenn sich alle Objekte erweitern java.lang.Object. Eine Möglichkeit bei Spring besteht darin, dass Bohnen mit Gültigkeitsbereich als Proxy verwendet werden, wenn sie in Singletons injiziert werden. Wenn toStringder falsche Thread aufgerufen wird (z. B. einer, der nicht dem Anforderungskontext zugeordnet ist), löst der Proxy beim Aufrufen eine Ausnahme toStringaus.
Murka
28

Ich hatte auch eine ähnliche Ausnahme beim Debuggen in Eclipse. Wenn ich mit der Maus über ein Objekt fuhr, wurde im Popup-Fenster eine com.sun.jdi.InvocationExceptionMeldung angezeigt . Die Hauptursache für mich war nicht die toString()Methode meiner Klasse, sondern die hashCode()Methode. Es verursachte ein NullPointerException, was dazu führte, dass das com.sun.jdi.InvocationExceptionwährend des Debuggens erschien. Nachdem ich mich um den Nullzeiger gekümmert hatte, funktionierte alles wie erwartet.

stepthom
quelle
16

Nun, es könnte an mehreren Dingen liegen, die von anderen vorher und nachher erwähnt wurden. In meinem Fall war das Problem dasselbe, aber der Grund war etwas anderes.

In einer Klasse (A) hatte ich mehrere Objekte und eines der Objekte war eine andere Klasse (B) mit einigen anderen Objekten. Während des Prozesses war eines der Objekte (String) aus Klasse B null, und dann habe ich versucht, über die übergeordnete Klasse (A) auf dieses Objekt zuzugreifen.

Daher löst die Konsole eine Nullpunktausnahme aus, aber der Eclipse-Debugger zeigt den oben genannten Fehler an.

Ich hoffe du kannst den Rest machen.

Anfänger
quelle
1
Dies war hilfreich +1
Mattyman
@novice Dies ist das gleiche Problem, mit dem ich konfrontiert bin. Wie kann ich das beheben?
Manjunath M
5

Für mich wurde die gleiche Ausnahme ausgelöst, als der toString als solcher definiert wurde:

@Override
public String toString() {
    return "ListElem [next=" + next + ", data=" + data + "]";
}

Wo ListElemist ein verknüpftes Listenelement und ich habe ein ListElemsolches erstellt:

private ListElem<Integer> cyclicLinkedList = new ListElem<>(3);
ListElem<Integer> cyclicObj = new ListElem<>(4);
...

cyclicLinkedList.setNext(new ListElem<Integer>(2)).setNext(cyclicObj)
    .setNext(new ListElem<Integer>(6)).setNext(new ListElem<Integer>(2)).setNext(cyclicObj);

Dies führte effektiv zu einer zyklisch verknüpften Liste, die nicht gedruckt werden kann. Danke für den Zeiger.

Arin
quelle
3

Ich hatte einmal das gleiche Problem. In meinem Fall wurde die toString () -Methode schlecht erstellt. Um genau zu sein, wurde eine statische Endvariable in die toString-Methode aufgenommen, als einem Entwickler aus meinem Team eine Codebereinigungsaufgabe zugewiesen wurde, und um Domänenobjekten nach Möglichkeit die Methoden toString (), hashCode () und equals () hinzuzufügen. Aber in den Klassen, weil er sie zu genau betrachtete, schloss er die letzte statische Variable ein, die die "com.sun.jdi.InvocationException" verursachte. Diese Ausnahme war beim Debuggen nur sichtbar, wenn ich mit der Maus über das Objekt fuhr, das die Ausnahme hat.

Praneeth
quelle
3

Ich habe eine ähnliche Ausnahme in Eclipse. Dies war auf einen java.lang.StackOverflowErrorFehler zurückzuführen. Ich hatte eine überschriebene toString()Methode in JoinColumnder untergeordneten Klasse, die eine Zeichenfolge mit dem Objekt der Elternklasse zurückgab, was zu einer zirkulären Abhängigkeit führte. Versuchen Sie, dieses Objekt zu entfernen toString(), und es wird funktionieren.

Neelesh Sharma
quelle
Perfekt. Danke vielmals.
Shubham Arya
2

Das Deaktivieren der Schaltfläche / des Symbols "Logische Struktur anzeigen" in der oberen rechten Ecke des Variablenfensters im Eclipse-Debugger hat das Problem in meinem Fall behoben.

clr
quelle
2

Also hatte ich hier das gleiche Problem. Es wurde festgestellt, dass meine Domäneninstanz von der Sitzung im Ruhezustand getrennt wurde. Ich habe isAttached()die Domain mit überprüft und angehängtd.attach()

monal86
quelle
2

Das war mein Fall

Ich hatte eine Einheit Schüler , die mit waren viele-zu-eins Beziehung mit einer anderen Unternehmen Klassen (die Klassen , die er untersuchte).

Ich wollte die Daten in einer anderen Tabelle speichern, die Fremdschlüssel sowohl für Schüler als auch für Klassen enthielt . Zu einer bestimmten Instanz der Ausführung, brachte ich eine Liste von Studenten unter bestimmten Bedingungen, und jeder Schüler wird eine Referenz hat Klassen Klasse.

Beispielcode :-

Iterator<Student> itr = studentId.iterator();
while (itr.hasNext()) 
{
    Student student = (Student) itr.next();
    MarksCardSiNoGen bo = new MarksCardSiNoGen();

    bo.setStudentId(student);

    Classes classBo = student.getClasses();

    bo.setClassId(classBo);
}

Hier können Sie sehen, dass ich sowohl den Schüler- als auch den Klassenverweis auf das BO setze , das ich speichern möchte. Beim Debuggen bei der Inspektion student.getClasses()wurde diese Ausnahme angezeigt ( com.sun.jdi.InvocationException).

Das Problem, das ich fand, war, dass ich nach dem Abrufen der Schülerliste mithilfe der HQL- Abfrage die Sitzung leerte und schloss . Als ich diese Aussage entfernte, war das Problem gelöst.session.close();

Die Sitzung wurde geschlossen, als ich endlich alle Daten in einer Tabelle ( MarksCardSiNoGen ) speicherte .

Hoffe das hilft.

Arun Sudhakaran
quelle
1

Ich hatte das gleiche Problem, weil ich die Lombok @ Data-Annotation verwendet habe, mit der toString- und Hashcode-Methoden in Klassendateien erstellt wurden. Daher habe ich die @ Data-Annotation entfernt und eine bestimmte @ Gettter @ Setter-Annotation verwendet, die mein Problem behoben hat.

Wir sollten @Data nur verwenden, wenn wir alle @ToString, @EqualsAndHashCode, @Getter für alle Felder und @Setter für alle nicht endgültigen Felder und @RequiredArgsConstructor benötigen.

MohdTausif
quelle
0

Es kann zwei Gründe geben, warum ein Element nicht existiert:

  1. Schlechter xpath (// * [@ id'forgotQuote])
  2. Korrekter xpath aber kein Element (// * [enthält (text (), 'Dieser Text befindet sich nicht auf der Seite')])

Würden Sie in beiden Fällen eine com.sun.jdi.InvocationException erhalten, wenn Sie Debug ausführen und mit der Maus über einen Verweis auf das WeBElement fahren (dies mit Selenium und Java)?

Wir verwenden Folgendes, können jedoch nicht unterscheiden, ob es aufgrund eines fehlerhaften xpath oder eines nicht vorhandenen Elements (gültige xpath-Syntax) false zurückgibt:

public static boolean isElementDisplayed(WebElement element) {
    boolean isDisplayed = false;

    try {
        isDisplayed = element.isDisplayed();
    } catch (NoSuchElementException e) {
        ;// No Worries
    }
    return isDisplayed;
}
user3257891
quelle
0

Entfernen hashCode()und equals()löste mein Problem. In meinem Fall habe ich Apaches Commons-Lang-Hash-Code verwendet und Builder zum manuellen Erstellen nicht statischer Klassen gleichgestellt, sodass der Compiler keine Ausnahme auslöste. Zur Laufzeit verursachte es jedoch die Aufrufausnahme.

Praneeth
quelle
0

In meinem Fall lag es daran, dass die Objektreferenz veraltet war. Ich habe meine Anwendung mit einem Selen-Webdriver automatisiert, also tippe ich etwas in ein Textfeld und navigiere dann zu einer anderen Seite. Während ich auf die vorherige Seite zurückkehre, wird dieses Objekt veraltet. Dies verursachte also die Ausnahme. Ich behandelte sie, indem ich die Elemente erneut initialisierte - PageFactory.initElements (Treiber, Test.class;

Gloria Rampur
quelle
0

Ich hatte auch das gleiche Problem. In meinem Fall habe ich einen getroffen java.util.UnknownFormatConversionException. Ich habe das erst herausgefunden, nachdem ich einen printStackTraceAnruf getätigt hatte. Ich habe es behoben, indem ich meinen Code wie unten gezeigt geändert habe.

von:

StringBuilder sb = new StringBuilder();
sb.append("***** Test Details *****\n");
String.format("[Test: %1]", sb.toString());

zu:

String.format("[Test: %s]", sb.toString());
Sailesh Chandran
quelle
-1

Ich hatte einmal das gleiche Problem. In meinem Fall lag es an der überschriebenen equalsMethode. Ein Wert kam null.

sonnig
quelle