Wie behebe ich einen NoSuchMethodError?
Ich bin immer ein NoSuchMethodError
Fehler beim ausführen von mein Java-Programm. Was ist falsch und wie behebe ich es?
In Netbeans: Rechtsklick auf Projekt im Projekte-tab, verwenden Sie "Clean and Build". Gelöst für mich.
Auch in Intellij Idea, rebuild löst das problem manchmal
Auch in Intellij Idea, rebuild löst das problem manchmal
InformationsquelleAutor John Meagher | 2008-08-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ohne weitere Informationen ist es schwierig zu sagen, das problem, aber die Ursache ist, dass Sie wahrscheinlich haben zusammengestellt, eine Klasse gegen eine andere version der Klasse, die fehlt, ist eine Methode, als die, die Sie verwenden, wenn es läuft.
Blick auf die stack-trace ... Wenn die exception bei dem Aufruf einer Methode auf einem Objekt in einer Bibliothek, haben Sie wahrscheinlich verschiedene Versionen der Bibliothek beim kompilieren und ausführen. Stellen Sie sicher, dass Sie die richtige version, beide stellen.
Wenn die exception beim Aufruf der Methode auf Objekten instanziiert Klassen Sie gemacht, dann ist Ihr build-Prozess scheint defekt sein. Stellen Sie sicher, dass die class-Dateien, die Sie tatsächlich ausgeführt werden aktualisiert, wenn Sie kompilieren.
InformationsquelleAutor Vetle
Ich hatte dein problem, und das ist, wie ich es behoben. Die folgenden Schritte sind einen funktionierenden Weg, um eine Bibliothek hinzuzufügen. Ich hatte die ersten zwei Schritte nach rechts, aber ich hätte das nicht getan die Letzte durch ziehen ".jar" - Datei direkt aus dem Dateisystem in den "lib" Ordner auf meinem eclipse-Projekt. Außerdem hatte ich zum entfernen der früheren version der Bibliothek sowohl aus dem build-Pfad und den "lib" Ordner.
Schritt 1 - Hinzufügen .jar to build path
Schritt 2 - Verbinden Quellen und javadocs (optional)
Schritt 3 - Tatsächlich ziehen .jar-Datei in den "lib" - Ordner (nicht optional)
InformationsquelleAutor Chris Dutrow
Beachten Sie, dass im Falle der Reflexion, erhalten Sie eine
NoSuchMethodException
, während mit nicht-reflektierenden code erhalten SieNoSuchMethodError
. Ich Neige dazu, zu gehen auf der Suche an sehr unterschiedlichen Orten, wenn konfrontiert mit einem im Vergleich zu den anderen.InformationsquelleAutor erickson
Wenn Sie Zugriff haben, ändern Sie das JVM-Parameter hinzufügen verbose Ausgabe sollte ermöglichen Sie, um zu sehen, welche Klassen geladen werden, aus was für Gläsern.
Wenn Ihr Programm ausgeführt wird, wird die JVM, sollte dump to standard out Informationen wie:
+1 Du meinen Tag gerettet! Es war nur eine Bibliothek enthalten, die alten Klassen mit gleichen Namen in den Quellen.
InformationsquelleAutor matt b
Dies ist in der Regel verursacht, wenn mit einem build-system wie Apache Ant, dass nur java-Dateien kompiliert, wenn die java-Datei neuer ist als die class-Datei. Wenn eine Methode, die Signatur ändert sich, und die Klassen waren mit der alten version kann die Dinge nicht kompiliert werden, richtig. Das übliche Update ist eine vollständige Neuerstellung (in der Regel "ant clean" und dann "Ameise").
Manchmal kann auch verursacht werden, beim kompilieren gegen eine version einer Bibliothek, sondern läuft gegen eine andere version.
InformationsquelleAutor John Meagher
Wenn mit Maven oder anderen Rahmen, und dieser Fehler fast zufällig, versuchen Sie eine saubere Installation wie...
Dies ist besonders wahrscheinlich, wenn Sie schrieb, das Objekt und Sie wissen, es hat Methode. Arbeitete für mich.
InformationsquelleAutor HoldOffHunger
Dies ist auch das Ergebnis von Reflexion. Wenn Sie code haben, der spiegelt sich auf eine Klasse und-Extrakten eine Methode mit Namen (zB: mit
Class.getDeclaredMethod("someMethodName", .....)
) dann ist jede Zeit, die Methode ändert sich der name, wie während einer umgestalten, müssen Sie zu erinnern, um die Aktualisierung der Parameter in der Reflexion-Methode entsprechend der neuen Signatur der Methode, oder diegetDeclaredMethod
call werfen wirdNoSuchMethodException
.Ist dies der Grund, dann wird der stack-trace sollte zeigen, dass die Reflexion-Methode aufgerufen und man muss nur zum aktualisieren der Parameter übereinstimmen, die eigentliche Signatur der Methode.
Meiner Erfahrung kommt dies gelegentlich auf, wenn das Gerät testen von privaten Methoden/Felder, und mit einem
TestUtilities
Klasse zu extrahieren Felder für test, Verifikation. (In der Regel mit legacy code, der nicht mit unit-Tests in den Sinn.)InformationsquelleAutor rcreswick
Wenn Sie schreiben eine webapp, sicherzustellen, dass Sie nicht miteinander in Konflikt stehende Versionen ein Glas in die container der global library-Verzeichnis und auch in Ihrer app. Sie müssen nicht unbedingt wissen, welches Glas verwendet wird, indem der classloader.
z.B.
InformationsquelleAutor Cheekysoft
Diese Probleme verursacht werden, die durch die Nutzung des gleichen Objekts gleichzeitig zwei Klassen.
Objekte verwendet, die nicht enthalten ist neue Methode wurde Hinzugefügt, dass das neue Objekt der Klasse enthält.
ex:
Diese Probleme entstehen durch die gleichzeitige 02 ähnlicher Klasse (1 in src -, 1 in der jar-Datei ist hier gateway.jar)
InformationsquelleAutor Quảng Trường Thời Đại
Es bedeutet, dass die jeweilige Methode nicht vorhanden ist in der Klasse:
InformationsquelleAutor Shrikant
Mir es passiert ist, weil ich gewechselt argument-type-in-Funktion, aus dem Objekt ein, um die Zeichenfolge ein. Ich könnte es lösen mit reinigen Sie und bauen Sie wieder
InformationsquelleAutor Tito
Habe ich gerade gelöst, dieser Fehler durch einen Neustart meine Eclipse und führen Sie die applcation.
Der Grund für meinen Fall kann, da ich Ersatz für meine source-Dateien ohne Abschluss mein Projekt oder Eclipse.
Die verursacht anderen version von Klassen, ich war mit.
InformationsquelleAutor Ryan Luo Xu
Diesem Weg versuchen: entfernen Sie alle .die class-Dateien unter Ihre Projekt-Verzeichnisse (und natürlich alle Unterverzeichnisse). Rebuild.
Manchmal
mvn clean
(wenn Sie mit maven) nicht reinigen .die class-Dateien manuell erstelltjavac
. Und die alten Dateien enthalten alte Signaturen, was zuNoSuchMethodError
.InformationsquelleAutor WHOIF
Nur das hinzufügen, um bereits vorhandene Antworten. Ich Stand vor diesem Problem mit tomcat in eclipse. Ich hatte mich geändert, einer Klasse und habe folgende Schritte,
Gereinigt und baute das Projekt in eclpise
mvn clean install
Weiterhin ich Stand vor dem gleichen Fehler. Dann ich gereinigt, tomcat, gereinigt tomcat-Arbeitsverzeichnis und server neu gestartet und mein Problem ist Weg. Hoffe, dies hilft jemand
InformationsquelleAutor Code_Mode
Behob ich dieses problem in Eclipse durch das umbenennen einer Junit-test-Datei.
In meinem Eclipse-Arbeitsbereich habe ich ein App-Projekt und ein Projekt Testen.
Das Test-Projekt hat das App-Projekt als erforderlich Projekt auf dem build-Pfad.
Begann sich die NoSuchMethodError.
Dann erkannte ich die Klasse in den Test-Projekt hatte den gleichen Namen wie die Klasse in das App-Projekt.
Nach der Umbenennung der Test auf den korrekten Namen "ProjectionTest.java" die Ausnahme ging Weg.
InformationsquelleAutor Dave Inlow
Ich lief in ein ähnliches problem, wenn ich beim ändern der Methode Unterschriften in meiner Anwendung.
Reinigung und Wiederaufbau meinem Projekt gelöst werden, die "NoSuchMethodError".
InformationsquelleAutor knorman
Obige Antwort erklärt sehr gut ..nur eine Sache hinzufügen
Wenn Sie mit eclipse mit Strg+shift+T und geben Sie package-Struktur der Klasse (z.B. : gateway.smpp.PDUEventListener ), finden Sie alle jars/Projekte, wo es vorhanden ist. Entfernen Sie unnötige Gläser aus Klassenpfad hinzufügen oder oben in der Klasse Weg. Jetzt wird es pick-up korrigieren.
InformationsquelleAutor prince
Lief ich in ähnliches Problem.
Schließlich erkannte ich die Ursache war, ändern Sie den Datentyp der variable.
Employee.java
--> Enthält die variable (EmpId
), deren Daten-Typ wurde geändert vonint
zuString
.ReportGeneration.java
--> Ruft den Wert über den getter,getEmpId()
.Sollen wir rebundle das Glas, indem nur die geänderten Klassen. Da gab es keine Veränderung in
ReportGeneration.java
ich war nur mit derEmployee.class
in der Jar-Datei. Ich konnte dieReportGeneration.class
- Datei in der jar, das Problem zu lösen.InformationsquelleAutor AnonymousCoder
Ich habe das gleiche problem. Dies ist auch verursacht, wenn es eine Mehrdeutigkeit in den Klassen. Mein Programm wurde versucht, eine Methode aufzurufen, die anwesend war in zwei JAR-Dateien in dem selben Ort /Klasse Weg. Löschen Sie eine JAR-Datei oder führen Sie Ihren code so, dass nur eine JAR-Datei verwendet wird. Überprüfen, dass Sie nicht mit der gleichen JAR-Datei oder verschiedene Versionen des gleichen JAR enthalten die gleiche Klasse.
InformationsquelleAutor ShankarDaruga
Antwort auf die ursprüngliche Frage. Laut java docs hier:
Normal, dieser Fehler ist gefangen durch den compiler, diese Fehler kann nur auftreten, zur Laufzeit, wenn die definition einer Klasse ist inkompatibel geändert.
InformationsquelleAutor challenger
Beste Erklärung: https://www.journaldev.com/14538/java-lang-nosuchmethoderror
InformationsquelleAutor Yash P Shah
Ich angetroffen habe diesen Fehler auch.
Mein problem war, dass ich geändert habe, eine Methode ist, die Unterschrift, so etwas wie
in
Diese Methode aufgerufen wurde aus einem Kontext, ähnlich
Den compiler schwieg mit Hinblick auf Warnungen/Fehler, da das Kapital sowohl die Währung als auch in Euro.
Tauchte das problem aufgrund der Tatsache, dass ich nur die kompilierte Klasse in der die Methode definiert wurde - Bank, aber nicht die Klasse, von der die Methode aufgerufen wird, die enthält die main () - Methode.
Diese Frage ist nicht etwas, die Sie stoßen, zu oft, wie Häufig das Projekt neu erstellt wird mannually oder ein Build-Aktion wird automatisch ausgelöst, anstatt nur zu kompilieren, die eine modifizierte Klasse.
Mein Anwendungsfall war, dass ich generiert .jar-Datei verwendet werden, da ein hotfix nicht enthalten App.class da diese nicht modifiziert wurde. Es machte Sinn für mich nicht zu zählen, wie ich es behielt das erste argument, die Basis-Klasse Trog Vererbung.
Die Sache ist, wenn Sie kompilieren, eine Klasse, die resultierende bytecode ist eine Art statische, in anderen Worten, es ist eine hart-Referenz.
Original disassemblierten bytecode (erzeugt mit dem tool javap) sieht wie folgt aus:
Nachdem der Klassenlader lädt die neue zusammengestellt Bank.class wird, wird es nicht finden, wie eine Methode, scheint es, als ob es entfernt wurde und nicht geändert, damit die genannten Fehler.
Hoffe, das hilft.
InformationsquelleAutor Mihai Savin
Das problem in meinem Fall war, dass zwei Versionen der gleichen Bibliotheken in den build-Pfad. Die ältere version der Bibliothek nicht die Funktion haben, und neuere haben.
InformationsquelleAutor K.K
Ich hatte ein ähnliches problem mit meinem Gradle-Projekt mit Intelij.
Ich löste es durch löschen der .gradle (siehe Abbildung unten) Paket-und Wiederaufbau das Projekt.
.gradle-Paket
InformationsquelleAutor J.Orlando
NoSuchMethodError : ich verbrachte ein paar Stunden dieses Problem zu beheben, endgültig fixiert wird es nur durch umbenennen der Namen des Pakets , reinigen und bauen ... Versuchen sauber aufzubauen erste ist, wenn es nicht funktioniert, versuchen Sie das umbenennen der name der Klasse oder Paket name und sauber bauen...es sollte behoben werden. Viel Glück.
InformationsquelleAutor Shirish Singh
Ich hatte den gleichen Fehler:
Es zu lösen habe ich geprüft, Erstens, Module Dependency-Diagramm (
click in your POM the combination -> Ctrl+Alt+Shift+U
oderright click in your POM -> Maven -> Show dependencies
) zu verstehen, wo genau der Konflikt zwischen Bibliotheken (Intelij IDEA). In meinem speziellen Fall, ich hatte verschiedene Versionen von Jackson Abhängigkeiten.1) Also, ich habe direkt in meiner POM des Projekts explizit die höchste version 2.8.7 von diesen beiden.
Eigenschaften:
Und als Abhängigkeit:
2) es kann Aber auch gelöst werden, mit Abhängigkeit AUSSCHLÜSSE.
Nach dem gleichen Prinzip wie unten im Beispiel:
Abhängigkeit mit unerwünschten version wird ausgeschlossen aus dem Projekt.
InformationsquelleAutor invzbl3
Falls Ihre Datei einen anderen Namen als den Namen der Klasse enthält main-Methode, dann kann es sein, dass diesen Fehler verursachen kann.
InformationsquelleAutor Amit Walke