546 Stimmen

Was bedeutet ein Fehler "Cannot find symbol" oder "Cannot resolve symbol"?

Bitte erläutern Sie das Folgende zu Fehlern wie "Cannot find symbol", "Cannot resolve symbol" oder "Symbol not found" (in Java):

  • Was bedeuten sie?
  • Welche Ursachen können sie haben?
  • Wie geht der Programmierer dabei vor, sie zu beheben?

Diese Frage soll eine umfassende Frage-und-Antwort-Runde zu diesen häufigen Kompilierungsfehlern in Java starten.

35voto

thinkterry Punkte 660

Sie erhalten auch diesen Fehler, wenn Sie ein new vergessen:

String s = String();

gegenüber

String s = new String();

weil der Aufruf ohne das new-Schlüsselwort versuchen wird, nach einer (lokalen) Methode namens String ohne Argumente zu suchen - und diese Methodensignatur ist wahrscheinlich nicht definiert.

27voto

Ajay Punkte 434

GELÖST

Mit IntelliJ verwenden

Auswählen Build->Projekt neu erstellen wird das Problem lösen

20voto

Jan Punkte 13540

Noch ein Beispiel für 'Variable ist außerhalb des Geltungsbereichs'

Da ich diese Art von Fragen schon ein paar Mal gesehen habe, vielleicht noch ein Beispiel dafür, was illegal ist, auch wenn es sich vielleicht richtig anfühlt.

Betrachten Sie diesen Code:

if(somethingIsTrue()) {
  String message = "Alles ist in Ordnung";
} else {
  String message = "Es ist ein Fehler aufgetreten";
}
System.out.println(message);

Das ist ungültiger Code. Denn keine der Variablen mit dem Namen message ist außerhalb ihres jeweiligen Geltungsbereichs sichtbar - in diesem Fall wären es die umgebenden geschweiften Klammern {}.

Sie könnten sagen: "Aber eine Variable mit dem Namen message ist so oder so definiert - also ist message nach dem if definiert".

Aber Sie lägen falsch.

Java hat keine free() oder delete Operatoren, daher muss es sich auf das Verfolgen des Gültigkeitsbereichs von Variablen verlassen, um herauszufinden, wann Variablen nicht mehr verwendet werden (zusammen mit Verweisen auf diese Variablen natürlich).

Es ist besonders schlimm, wenn man denkt, man hätte etwas Gutes getan. Ich habe diesen Fehler oft gesehen, nachdem ich Code "optimiert" hatte, zum Beispiel so:

if(somethingIsTrue()) {
  String message = "Alles ist in Ordnung";
  System.out.println(message);
} else {
  String message = "Es ist ein Fehler aufgetreten";
  System.out.println(message);
}

"Oh, da ist doppelter Code, lass uns diese gemeinsame Zeile herausziehen" -> und da ist es.

Der häufigste Weg, mit dieser Art von Geltungsbereichsproblemen umzugehen, wäre es, die else-Werte den Variablennamen im äußeren Geltungsbereich vorab zuzuweisen und sie dann im if erneut zuzuweisen:

String message = "Es ist ein Fehler aufgetreten";
if(somethingIsTrue()) {
  message = "Alles ist in Ordnung";
} 
System.out.println(message);

13voto

Joel Costigliola Punkte 5965

Ein Weg, um diesen Fehler in Eclipse zu erhalten:

  1. Definieren Sie eine Klasse A in src/test/java.
  2. Definieren Sie eine weitere Klasse B in src/main/java, die die Klasse A verwendet.

Ergebnis: Eclipse wird den Code kompilieren, aber Maven wird "Cannot find symbol" anzeigen.

Ursächlich dafür: Eclipse verwendet einen kombinierten Build-Pfad für die Haupt- und Testbäume. Leider unterstützt es nicht die Verwendung von unterschiedlichen Build-Pfaden für verschiedene Teile eines Eclipse-Projekts, was Maven erfordert.

Lösung:

  1. Definieren Sie Ihre Abhängigkeiten nicht auf diese Weise; machen Sie also nicht diesen Fehler.
  2. Erstellen Sie regelmäßig Ihre Codebasis mit Maven, damit Sie diesen Fehler frühzeitig erkennen. Eine Möglichkeit besteht darin, einen CI-Server zu verwenden.

8voto

GT_hash Punkte 145

„Can not find“ bedeutet, dass der Compiler keine geeignete Variable, Methode, Klasse usw. finden kann. Wenn Sie diese Fehlermeldung erhalten, möchten Sie zunächst die Codezeile finden, in der Sie die Fehlermeldung erhalten haben.

Dann können Sie herausfinden, welche Variable, Methode oder Klasse nicht definiert wurden, bevor sie verwendet wurden. Nach Bestätigung initialisieren Sie diese Variable, Methode oder Klasse, damit sie später verwendet werden können erforderlich. Beachten Sie das folgende Beispiel.

Ich werde eine Demo-Klasse erstellen und einen Namen ausgeben...

class Demo {
    public static void main(String a[]) {
        System.out.print(name);
    }
}

Schauen Sie sich jetzt das Ergebnis an..

Geben Sie hier eine Bildbeschreibung ein

Dieser Fehler besagt, dass die "Variable name nicht gefunden werden kann". Durch Definieren und Initialisieren des Werts für die 'name'-Variable kann dieser Fehler beseitigt werden. Tatsächlich so,

class Demo {
    public static void main(String a[]) {

        String name = "smith";

        System.out.print(name);
    }
}

Schauen Sie sich jetzt das neue Ergebnis an...

Geben Sie hier eine Bildbeschreibung ein

Ok, wir haben diesen Fehler erfolgreich gelöst. Gleichzeitig, wenn Sie „Methode nicht finden“ oder „Klasse nicht finden“ erhalten, definieren Sie zuerst eine Klasse oder Methode und verwenden Sie sie dann.

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