Was macht ein "Cannot find symbol" Kompilierungs-Fehler bedeuten?
Erläutern Sie bitte das folgende über die "Cannot find symbol" - Fehler:
- Was hat dieser Fehler zu bedeuten?
- Was kann diesen Fehler verursachen?
- Wie funktioniert der programmer gehen Sie zum beheben dieses Fehlers?
Diese Frage ist entworfen, um eine umfassende Frage zu "cannot find symbol" Kompilierungs-Fehler in Java.
InformationsquelleAutor Stephen C | 2014-09-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
1. Was macht ein "Cannot find symbol" - Fehler bedeuten?
Erstens, es ist ein Kompilierungsfehler1. Es bedeutet, dass entweder es ist ein problem in der Java-Quell-code, oder es ist ein problem in der Weise, die Sie kompilieren es.
Ihre Java-Quellcode besteht aus den folgenden Sachen:
true
,false
,class
,while
, und so weiter.42
und'X'
und"Hi mum!"
.+
,=
,{
, und so weiter.Reader
,i
,toString
,processEquibalancedElephants
, und so weiter.Einen "Cannot find symbol" - Fehler ist über den Bezeichner. Wenn Ihr code wird kompiliert, der compiler braucht, um herauszufinden, was jede und jeder Bezeichner im code bedeutet.
Einen "Cannot find symbol" - Fehler bedeutet, dass der compiler kann dies nicht tun. Ihr code erscheint zu sein sich auf etwas bezieht, dass der compiler nicht versteht.
2. Was kann die Ursache für ein "Cannot find symbol" - Fehler?
Als eine der ersten Bestellung, es gibt nur eine Ursache. Der compiler sah in all der Orte, an denen der Bezeichner sollte definiert werden, und es konnte nicht finden, dass die definition. Dies könnte verursacht werden durch eine Reihe von Dingen. Die häufigsten sind wie folgt:
StringBiulder
stattStringBuilder
. Java kann nicht und wird nicht versuchen, zu kompensieren für schlechte Rechtschreibung oder Tippfehler.stringBuilder
stattStringBuilder
. Alle Java-Bezeichner sind case-Sensitiv.mystring
undmy_string
unterschiedlich sind. (Wenn Sie an der Java-style-Regeln, werden Sie weitgehend geschützt von diesem Fehler ...)"someString".push()
2."someString".length
odersomeArray.length()
.Für Bezeichner entsprechen, sollten Klassennamen:
Vielleicht haben Sie vergessen ein
new
:Fällen, in denen Typ oder Instanz erscheint nicht auf das Mitglied, das Sie erwartet hatten, es zu haben:
Das problem ist oft eine Kombination der oben genannten. Zum Beispiel, vielleicht haben Sie "star" importiert
java.io.*
und dann versucht, denFiles
Klasse ... das ist injava.nio
nichtjava.io
. Oder vielleicht haben Sie gedacht, zu schreibenFile
... die ist eine Klasse injava.io
.Hier ist ein Beispiel, wie falsche variable scoping kann dazu führen, ein "Cannot find symbol" - Fehler:
Dies gibt ein "Cannot find symbol" - Fehler für
i
imif
- Anweisung. Obwohl wir zuvor erklärti
, diese Erklärung ist nur im Rahmen für diefor
Aussage und seinen Körper. Der Verweis aufi
imif
Anweisung nicht sehen, die Erklärung deri
. Es ist out of scope.(Eine entsprechende Korrektur hier möglicherweise verschieben die
if
Anweisung innerhalb der Schleife, oder erklären Siei
vor dem start der Schleife.)Hier ist ein Beispiel, dass die Ursachen der Verwirrung, wo ein Tippfehler führt zu einem scheinbar unerklärlichen "Cannot find symbol" - Fehler:
Dadurch erhalten Sie einen Kompilierungsfehler in der
println
Anruf, die sagen, dassi
kann nicht gefunden werden. Aber (höre ich Sie sagen) ich habe es erklären!Das problem ist der hinterhältige Semikolon (
;
) vor der{
. Die Java-Sprache, - syntax definiert ein Semikolon in diesem Zusammenhang ein leere Anweisung. Die leere Anweisung wird dann der Körper desfor
Schleife. So, dass code tatsächlich bedeutet dies:Den
{ ... }
block ist NICHT der Körper derfor
Schleife, und daher die Vorherige Deklaration voni
imfor
Aussage ist out of scope in den block.Hier ist ein weiteres Beispiel von "Cannot find symbol" - Fehler, verursacht durch einen Tippfehler.
Trotz der vorherigen Erklärung, die
tmp
imtmp(...)
Ausdruck ist fehlerhaft. Der compiler sucht nach einer Methode namenstmp
, und nicht finden. Die zuvor deklariertentmp
ist im Namensraum für Variablen, die nicht den Namensraum für Methoden.In dem Beispiel, das ich stieß, war der Programmierer hatte eigentlich Links aus einem operator. Was er meinte, zu schreiben, war dies:
Es ist ein weiterer Grund, warum der compiler kann nicht finden das symbol an, wenn Sie kompilieren von der Befehlszeile aus. Sie könnten einfach vergessen haben, zu kompilieren oder kompilieren eine andere Klasse. Zum Beispiel, wenn Sie Klassen
Foo
undBar
woFoo
verwendetBar
. Wenn du noch nie kompiliertBar
und Sie laufenjavac Foo.java
sind, haften Sie zu finden, die der compiler nicht finden können, das symbolBar
. Die einfache Antwort ist, um zu kompilierenFoo
undBar
zusammen; z.B.javac Foo.java Bar.java
oderjavac *.java
. Oder noch besser, verwenden Sie eine Java-build-tool; z.B. Ant, Maven, Gradle und so weiter.Gibt es einige andere, mehr obskure Gründe zu ..., mit denen ich mich befassen sich mit unten.
3. Wie behebe ich diese Fehler ?
Generell, beginnen Sie mit, herauszufinden, was verursacht der Kompilierung Fehler.
Dann denke über das, was Ihr code sollte zu sagen. Schließlich arbeiten Sie heraus, welche Korrektur Sie vornehmen müssen, um Ihren source-code zu tun, was Sie wollen.
Beachten Sie, dass nicht jede "Korrektur" korrigieren. Bedenken Sie:
Angenommen, dass der compiler sagt "Cannot find symbol" für
j
. Es gibt viele Möglichkeiten konnte ich "beheben", dass:for
zufor (int j = 1; j < 10; j++)
- wahrscheinlich richtig.j
vor das innerefor
loop, oder der äußerefor
loop - ggf. korrigieren.j
zui
im innerenfor
loop - wahrscheinlich falsch!Der Punkt ist, dass Sie müssen zu verstehen, was dein code versucht zu tun, um zu finden, die Recht fix.
4. Obskuren Ursachen
Hier sind ein paar Fälle, in denen die "Cannot find symbol" ist scheinbar unerklärlich ... bis man genauer hinschaut.
Falsche Abhängigkeiten: Wenn Sie ein IDE-oder ein build-tool für die Verwaltung der build-Pfad und die Projekt-Abhängigkeiten, die Sie gemacht haben, ein Fehler mit den Abhängigkeiten; z.B. Links aus einer Abhängigkeit, oder die falsche version. Wenn Sie eine build-Tools (Ant, Maven, Gradle, etc), überprüfen Sie die Projekt-build-file. Wenn Sie ein IDE sind, überprüfen Sie die Projekt-build path-Konfiguration.
Sie nicht neu kompilieren: manchmal passiert Es, dass neue Java-Programmierer nicht verstehen, wie die Java-toolchain funktioniert, oder noch nicht implementiert, eine reproduzierbare "build-Prozess"; z.B. mit einer IDE, Ant, Maven, Gradle und so weiter. In einer solchen situation, kann der Programmierer am Ende jagt seinen Schwanz auf der Suche für eine illusorische Fehler, ist eigentlich verursacht indem man nicht neu kompilieren Sie den code richtig, und wie ...
Einem früheren build problem: Es ist möglich, dass ein früherer Aufbau nicht in einer Weise, gab eine JAR Datei mit den Klassen fehlen. Ein solcher Fehler würde in der Regel bemerkt werden, wenn Sie wurden mit einem build-tool. Allerdings, wenn Sie bekommen die JAR-Dateien von jemand anderes, Sie sind abhängig von Sie Gebäude richtig, und bemerkt Fehler. Wenn Sie vermuten, dass dies, verwenden Sie
tar -tvf
zum auflisten des Inhalts des verdächtigen JAR-Datei.IDE Probleme: Personen berichteten von Fällen, in denen Ihre IDE verwechselt wird und der compiler in der IDE nicht finden können, eine Klasse, die nicht existiert ... oder die umgekehrte situation.
Dies kann passieren, wenn der IDE-caches get out of sync mit dem Dateisystem. Es gibt IDE-spezifische Möglichkeiten, um das zu beheben.
Dies könnte ein IDE-bug. Zum Beispiel @Joel Costigliola beschreibt ein Szenario, in denen Eclipse nicht verarbeitet Maven "test" - Baum korrekt: finden Sie hier.
Neudefinition system Klassen: ich habe Fälle gesehen, wo der compiler beschwert sich, dass
substring
ist ein unbekanntes symbol in etwas wie das folgendeEs stellte sich heraus, dass der Programmierer erstellt hatte Ihre eigene version der
String
und dass seine version der Klasse nicht definierensubstring
Methoden.Lektion: Don ' T definieren Sie Ihre eigenen Klassen mit dem gleichen Namen, die als gemeinsame Bibliothek Klassen!
Homoglyphs: Wenn Sie die Verwendung von UTF-8 encoding für alle Quell Dateien, es ist möglich, Bezeichner, Aussehen das gleiche, sind aber in der Tat anders, weil Sie enthalten homoglyphs. Sehen auf dieser Seite für weitere Informationen.
Können Sie vermeiden, indem Sie beschränken sich auf ASCII oder Latin-1 als Quell-Datei-Codierung und mit Hilfe von Java
\uxxxx
entweicht anderen Zeichen.1 - Wenn, vielleicht, du tun finden Sie diese in eine runtime-exception oder error-Meldung, dann ist man entweder so konfiguriert haben, dass Ihre IDE, um code auszuführen, mit der Kompilierung Fehler, oder Ihre Anwendung ist das generieren und kompilieren von code .. zur Laufzeit.
2 - Die drei Grundprinzipien des Bauingenieurwesen: Wasser nicht bergauf fließen, eine Planke ist stärker auf die Seite, und können Sie nicht drücken Sie auf ein string.
Etwas ähnlich wie der Kommentar oben, wenn ich kompilieren und ausführen, mein Programm aus Eclipse heraus funktioniert es ohne problem. Kompilieren über die Konsole wirft eine Reihe von diese "Cannot find symbol" - Fehler oft im Zusammenhang mit dem letzten element in einer import. Ich habe keine Ahnung, was die Ursache dieses, wie es ist nichts falsch in dem code wirklich.
Menschen neu in Java sind manchmal die Vermischung der array-Typen mit Ihren Komponenten-Typen, zum Beispiel
String[] strings = { "hello", "world" }; strings.chatAt(3);
.InformationsquelleAutor Stephen C
Erhalten Sie auch diese Fehlermeldung, wenn Sie vergessen, eine
new
:versus
InformationsquelleAutor thinkterry
Einem weiteren Beispiel für die "Variable out of scope'
Als ich gesehen habe, dass die Art von Fragen, die ein paar mal schon, vielleicht noch ein Beispiel, was illegal ist, auch wenn es vielleicht fühlen okay.
Betrachten Sie diesen code:
Das ist Ungültiger code. Da keine der Variablen namens
message
sichtbar ist, außerhalb Ihrer jeweiligen Reichweite - das wäre der umgebenden Klammern{}
in diesem Fall.Könnte man sagen: "Aber eine variable namens message definiert ist, entweder Weg - so Nachricht ist definiert nach der
if
".Aber Sie würden falsch sein.
Java hat keine
free()
oderdelete
Betreiber, also es muss sich auf die Verfolgung, Geltungsbereich von Variablen, um herauszufinden, wenn Variablen nicht mehr verwendet (zusammen mit Referenzen auf diese Variablen von der Ursache).Ist es besonders schlimm, wenn Sie dachten, Sie Taten etwas gutes. Ich habe gesehen, diese Art von Fehler nach der "Optimierung" code wie folgt:
"Oh, da ist duplizierten code, lassen Sie uns ziehen, dass der gemeinsame line-out" -> und gibt es Sie.
Der häufigste Weg, um den Umgang mit dieser Art von Rahmen-Problem wäre, auf vor-weisen der anderen Werte in die Variablen-Namen im außen Bereich und dann neu zuweisen, wenn:
Die bessere Lösung für code, weist einen anderen Wert an jedem Zweig ist ein leer
final
Deklaration von Variablen.InformationsquelleAutor Jan
Einen Weg, um diese Fehler in Eclipse :
A
imsrc/test/java
.B
imsrc/main/java
verwendet KlasseA
.Ergebnis : Eclipse kompiliert den code, aber maven geben wird "Cannot find symbol".
Zugrunde liegende Ursache : die Eclipse ist mit einer kombinierten build-Pfad für den Haupt-und test-Bäume. Leider, es unterstützt nicht die Verwendung von anderen build-Pfade für die verschiedenen Teile ein Eclipse-Projekt, das ist, was Maven benötigt.
Lösung :
was auch immer Sie im Verzeichnis src/main/java definiert werden muss im Verzeichnis src/main/java oder in jedem compile - /Laufzeit-Abhängigkeiten (nicht test-Abhängigkeiten).
InformationsquelleAutor Joel Costigliola
"Kann nicht gefunden" bedeutet , dass es compiler, die nicht finden können, eine geeignete variable, Methode ,Klasse, etc..., wenn Sie, dass Fehler-massage , erste von allen, die Sie wollen zu finden, die code-Zeile, wo der error massage..Und dann werden Sie in der Lage, um herauszufinden, welche Variablen , Methode oder Klasse nicht definieren, bevor Sie es.Nach der Bestätigung initialisiert die variable ,Methode oder Klasse kann verwendet werden, für später benötigen...Betrachten Sie das folgende Beispiel.
Erstelle ich eine demo-Klasse und drucken einen Namen...
Schauen Sie sich jetzt das Ergebnis..
Dass Fehler sagt, "variable-name kann nicht gefunden"..Definieren und initialisieren mit dem Wert für 'name' - variable kann abgeschafft werden, dass Fehler..Eigentlich wie diese,
Schauen Sie sich jetzt die neue Ausgabe...
Ok Erfolgreich gelöst, dass Fehler..At die gleiche Zeit , wenn Sie könnten "nicht finden können-Methode" oder "can not find class" etwas , Auf den ersten,definieren Sie eine Klasse oder Methode und nach dem Gebrauch, dass..
InformationsquelleAutor GT_hash
Wenn Sie immer diese Fehlermeldung in der build woanders, während die IDE sagt, alles, was völlig in Ordnung ist, dann prüfen, dass Sie die gleiche Java-Versionen in beiden Orten.
Beispielsweise Java 7 und Java 8 haben unterschiedliche APIs, also den Aufruf einer nicht existierenden API in einer älteren Java-version würde diesen Fehler verursachen.
InformationsquelleAutor Jonathan Lin
Wenn der eclipse-Java-build-Pfad zugeordnet ist, 7, 8 und im Projekt pom.xml Maven-properties-java.version erwähnt wird, eine höhere Java-version(9,10,11, etc..,) über 7,8 benötigen Sie ein update pom.xml Datei.
In Eclipse, wenn Java zugeordnet ist Java in der version 11 und in pom.xml zugeordnet ist Java in der version 8. Update von Eclipse unterstützt Java-11, indem Sie gehen durch die unten aufgeführten Schritte in der eclipse-IDE
Hilfe -> Installieren Sie Neue Software ->
Fügen Sie den folgenden link http://download.eclipse.org/eclipse/updates/4.9-P-builds bei Arbeit Mit
oder
Hinzufügen (Popup-Fenster öffnet sich) ->
Name:
Java-11-UnterstützungLocation:
http://download.eclipse.org/eclipse/updates/4.9-P-buildsdann update Java-version in Maven Eigenschaften pom.xml - Datei, wie unten
Schließlich tun, der rechten Maustaste auf Projekt-Debug as - > Maven-clean -, Maven-build-Schritte
InformationsquelleAutor pudaykiran
War ich auch immer diese Fehlermeldung. (für die ich gegoogelt und ich wurde auf diese Seite verwiesen)
Problem: ich war Aufruf einer statischen Methode in der Klasse definiert ein Projekt von einer Klasse definiert, die in einem anderen Projekt B.
Ich war immer der folgende Fehler:
Lösung: ich dieses Problem gelöst, indem zuerst das Projekt zu erstellen, in der die Methode definiert ist, dann das Projekt, wo die Methode aufgerufen wurde.
InformationsquelleAutor Maria
Für die Hinweise, schauen Sie näher an die Klasse name, die wirft einen Fehler und die Nummer der Zeile, Beispiel:
Kompilierungs-Fehler
[FEHLER] \applications\xxxxx.java:[44,30] error: cannot find symbol
Einer anderen Ursache nicht unterstützte Methode für die java-version sagen jdk7 vs 8.
Überprüfen Sie Ihre %JAVA_HOME%
InformationsquelleAutor Striker
Kann es verschiedene Szenarien, wie bereits oben erwähnt. Ein paar Dinge, die mir geholfen haben, dieses Problem beheben.
Wenn Sie mit IntelliJ
File -> 'Invalidate Caches/Restart'
ODER
Der Klasse verwiesen wird, wurde in einem anderen Projekt und, dass die Abhängigkeit wurde nicht Hinzugefügt, um die Gradle-build-file von meinem Projekt. Also ich habe die Abhängigkeit mit
compile project(':anotherProject')
und es funktionierte. HTH!
InformationsquelleAutor avp