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 ~
Antworten:
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.
quelle
toString
wird immer definiert, wenn sich alle Objekte erweiternjava.lang.Object
. Eine Möglichkeit bei Spring besteht darin, dass Bohnen mit Gültigkeitsbereich als Proxy verwendet werden, wenn sie in Singletons injiziert werden. WenntoString
der falsche Thread aufgerufen wird (z. B. einer, der nicht dem Anforderungskontext zugeordnet ist), löst der Proxy beim Aufrufen eine AusnahmetoString
aus.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.InvocationException
Meldung angezeigt . Die Hauptursache für mich war nicht dietoString()
Methode meiner Klasse, sondern diehashCode()
Methode. Es verursachte einNullPointerException
, was dazu führte, dass dascom.sun.jdi.InvocationException
während des Debuggens erschien. Nachdem ich mich um den Nullzeiger gekümmert hatte, funktionierte alles wie erwartet.quelle
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.
quelle
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
ListElem
ist ein verknüpftes Listenelement und ich habe einListElem
solches 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.
quelle
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.
quelle
Ich habe eine ähnliche Ausnahme in Eclipse. Dies war auf einen
java.lang.StackOverflowError
Fehler zurückzuführen. Ich hatte eine überschriebenetoString()
Methode inJoinColumn
der 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 entfernentoString()
, und es wird funktionieren.quelle
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.
quelle
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()
quelle
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.
quelle
Ich habe erhalten,
com.sun.jdi.InvocationException occurred invoking method
wenn ich ein Entitätsfeld verzögert geladen habe, das eine sekundäre Datenbankkonfiguration verwendet hat ( Spring Boot mit 2 Datenbankkonfigurationen - verzögertes Laden mit zweiter Konfiguration funktioniert nicht ). Temporäre Lösung war hinzuzufügenFetchType.EAGER
.quelle
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.
quelle
Es kann zwei Gründe geben, warum ein Element nicht existiert:
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; }
quelle
Entfernen
hashCode()
undequals()
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.quelle
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;
quelle
Ich hatte auch das gleiche Problem. In meinem Fall habe ich einen getroffen
java.util.UnknownFormatConversionException
. Ich habe das erst herausgefunden, nachdem ich einenprintStackTrace
Anruf 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());
quelle
Ich hatte einmal das gleiche Problem. In meinem Fall lag es an der überschriebenen
equals
Methode. Ein Wert kamnull
.quelle