[JAVA] [Für Anfänger] Wo kann überprüft werden, wann eine Klasse zur Kompilierungszeit nicht gefunden werden kann?

Zielgruppe des Artikels

Als ich darüber nachdachte, Java-Befehle selbst zu kompilieren und auszuführen, Schreiben Sie den Quellcode, erstellen Sie eine Ordnerhierarchie, platzieren Sie den Quellcode und so weiter. Wenn es um das Kompilieren mit dem Befehl javac geht

"Kann das Symbol nicht finden"

Ist es nicht möglich, dass Sie aufgrund dieser einen Zeile niemals eine Klassendatei erstellen können? Da syntaktische Fehler relativ detaillierte Informationen liefern, ist es einfach, die Ursache zu identifizieren. In Bezug auf den Fehler, dass die Klasse nicht gefunden werden kann, unterscheiden sich die Korrekturpunkte je nach Implementierungsinhalt Es gibt kein "Wenn Sie dies beheben, wird es behoben!"

Aber was ein Anfänger wirklich braucht, ist Es handelt sich nicht um Informationen, die nur in Einzelfällen verwendet werden können, z. Es kann wiederverwendet werden als "die Ursache kann durch einen Blick hier aufgrund des Mechanismus verstanden werden" Ich denke, es debuggt Wissen.

Dieses Mal, als ich den Mechanismus der Kompilierung studierte, für "Ich kann das Symbol nicht finden" Ich bin gekommen, um zu sehen, wie ich es angehen soll Ich möchte an dieser Stelle mein Debugging-Verfahren vorstellen.

Standpunkt 1: Stimmt der Klassenname überein?

Die Kratzer sollten flach sein. Als Ergebnis einer großen Umfrage aus der Perspektive einer späteren Einführung Es ist zu schmerzhaft an einem Tag, an dem die Fehlerursache nur ein Tippfehler war. Ist die Deklaration der Test.java-Klasse zunächst auf `` `public class Tst``` gesetzt (ein Beispiel)? Ich vermute einen Tippfehler. Mit Ausnahme der Klassendeklaration und der Paketspezifikation werden Sie in Syntaxfehler verwickelt. Ich jage nicht so weit.

Standpunkt 2: Was ist die Art der Klasse?

Der Typ hier ist die Klasse, die nicht gefunden werden kann Ob es sich um eine ** Bootstrap-Klasse ** oder eine ** Klasse handelt, die in einer JAR-Datei gespeichert ist ** Ist es eine ** Benutzerklasse **?

Wenn Sie mehr über die Bootstrap-Klasse und die Benutzerklasse erfahren möchten, Informieren Sie sich über Java-Klassenlader und die Suche nach Typen zur Kompilierungszeit.

Ich werde die Details hier überspringen und Ihnen eine grobe Einführung geben.

--Bootstrap-Klasse Kernfunktionen wie das häufig verwendete Paket java.lang wie die Kern-API des JDK sind hier enthalten. --Benutzerklasse Diese Klasse wird vom Benutzer (Programmierer) erstellt. Wird auch als benutzerdefinierte Klasse bezeichnet. --Klasse in JAR-Datei gespeichert Es gibt verschiedene Bibliotheken von Drittanbietern, benutzerdefinierte Bibliotheken usw. Es ist dasjenige, das häufig mit Eclipse zum Erstellungspfad hinzugefügt wird.

Was hier beurteilt werden kann, ist die Klasse, die nicht gefunden werden kann Setzen Sie im Fall der Bootstrap-Klasse "Java-Umgebungsvariable, die JDK angibt". Bei Benutzerklassen bedeutet dies, an der "Klassenpfadvariablen" zu zweifeln.

Ich kann nicht sagen, ob es sich um eine Bootstrap-Klasse handelt. In diesem Fall beziehen Sie sich auf Core API Document.

Wenn die Bootstrap-Klasse nicht gefunden wird

Da das JDK nicht angegeben wurde, lautet die Umgebungsvariable "JAVA_HOME" Lassen Sie uns überprüfen, ob es richtig eingestellt ist. Es gibt viele Artikel zum Festlegen von JAVA_HOME, daher werde ich darauf verzichten.

Wenn die Klasse in der JAR-Datei nicht gefunden wird

Die Angabe des Klassenpfads in der JAR-Datei unterscheidet sich geringfügig von der Angabe des Klassenpfads in der Klassendatei. Der einzige Unterschied besteht jedoch darin, ob Sie ein Verzeichnis oder die JAR-Datei selbst angeben. Überprüfen wir, ob die Befehlssyntax korrekt ist.

#Für Glas
$ javac -classpath /lib/example-lib.jar Example.java
#Für Klassendateien
$ javac -classpath /lib Example.java

Wenn die Benutzerklasse nicht gefunden werden kann

In diesem Fall gibt es noch einige weitere Perspektiven. Wenn dies der Fall ist, lesen Sie bitte den folgenden Inhalt weiter.

Standpunkt 3: Ist der Klassenpfad korrekt angegeben?

Laden von Benutzerklassen und Bibliotheken von Drittanbietern Der Klassenpfad muss sowohl in Kaninchen als auch in Ecken korrekt angegeben werden. Wenn Sie den Mechanismus der Klassenpfadspezifikation nicht richtig verstehen, funktioniert er irgendwie nicht.

Im Folgenden werden die Gesichtspunkte bei der Überprüfung des Klassenpfads vorgestellt. Sie müssen nicht in der Reihenfolge der Einführung untersuchen.

Standpunkt 3-1: Ist die Paketroute angegeben?

Davon abgesehen wurde es durch andere Erklärungen vorangetrieben und ignoriert. Die Tatsache, dass "wenn Sie eine Pakethierarchie im Klassenpfad angeben, diese nicht erfolgreich importiert wird". Ich denke, es ist zu offensichtlich, um geschrieben zu werden, aber ich wurde hier erwischt.

Dies bedeutet, dass es die folgende Ordnerstruktur gibt und in UseCommons.java Angenommen, Sie importieren `` `com.example.util```, weil Sie StrFactory verwenden möchten. スクリーンショット 2020-05-25 16.25.32.png

UseCommons.java


package com.example.util;

Im obigen Fall wird src als Paketstamm und com ~ app als Pakethierarchie erkannt. Was ich beim Kompilieren gemacht habe

#Das aktuelle Verzeichnis ist/src
$ javac -classpath /src/com/example/util com/example/app/UseCommons.java

Wie oben erwähnt, durch Angabe von `` `/ src / com / example / utilim Klassenpfad, Ich wollte die Klassen unter util laden und UseCommons.java kompilieren. Java folgt jedoch der Pakethierarchie ab dem durch den Klassenpfad ** angegebenen Verzeichnis Wenn UseCommons.java mit den obigen Einstellungen zu StrFactory.java wechselt,/src/com/example/util/com/example/util```Ich werde es sehen.

Mit anderen Worten, der richtige Klassenpfad lautet wie folgt und gibt den Paketstamm src an.

#Das aktuelle Verzeichnis ist/src
$ javac -classpath /src com/example/app/UseCommons.java

Aus der obigen Sicht mit dem Paketstamm, der in der Option -classpath angegeben ist An der Stelle, an der der Inhalt der in der Klassendatei deklarierten Importanweisung verkettet wird Lassen Sie uns überprüfen, ob die Klasse, die Sie laden möchten, platziert ist.

Standpunkt 3-2: Ist die Standardeinstellung deaktiviert?

Ich denke, das ist der beste Songwriter. Was standardmäßig festgelegt wurde, wird durch Angabe von Optionen usw. überschrieben. Wenn die erforderlichen Einstellungen deaktiviert sind, ist dies schwer zu bemerken, da Sie sich dessen normalerweise nicht bewusst sind.

-classpath wird normalerweise auf ". (Aktuelles Verzeichnis)" gesetzt. Schauen Sie sich vor diesem Hintergrund das folgende Beispiel an. スクリーンショット 2020-05-25 16.16.19.png

Ursprünglich hatte es die obige Konfiguration, sodass Sie es normal mit dem folgenden Befehl kompilieren können.

#Das aktuelle Verzeichnis ist/src
$ javac com/example/app/UseCommons.java

Verwenden Sie danach jedoch die externe Bibliothek "commons-lang3-3.10.jar" in UseCommons.java. Ich entschied mich für die Verwendung und änderte die Ordnerstruktur wie folgt. スクリーンショット 2020-05-25 17.00.46.png Als ich dann die Commons-Bibliothek zum Klassenpfad hinzufügte und den folgenden Befehl ausführte, Ich erhalte die Fehlermeldung, dass StrFactory nicht gefunden werden kann.

#Das aktuelle Verzeichnis ist/src
$ javac -classpath /lib/commons-lang3-3.10.jar com/example/app/UseCommons.java

Dies ist die Standardeinstellung der Klassenpfadoption ". (Das aktuelle Verzeichnis im Beispiel ist / src)" Dies liegt daran, dass Java unter src nicht mehr nach Klassen suchen kann, da es überschrieben wurde. Wenn Sie den obigen Befehl wie folgt ändern, wird der Fehler daher behoben.

#Das aktuelle Verzeichnis ist/src
$ javac -classpath /lib/commons-lang3-3.10.jar:. com/example/app/UseCommons.java

Am Ende

Das ist die Debugging-Perspektive zur Kompilierungszeit, die ich heute haben kann. Ich denke, es gibt verschiedene andere Perspektiven, also ist es nur für Anfänger zu lernen. Ich hoffe, Sie werden es als Hilfe für den ersten Schritt erkennen. Je breiter die Perspektive, desto besser, daher möchte ich mein Lernen vertiefen.

Ich habe auch in anderen Artikeln über Java-Kompilierung geschrieben Wenn Sie daran interessiert sind, wie die Zusammenstellung funktioniert, lesen Sie bitte auch die folgenden Artikel.

Link zum Artikel: [Einführung in Java-Befehle Kapitel 3 Kompilieren des Quellcodes](https://qiita.com/maple_syrup/items/c0aa2eacb8f486dc52a8#%E7%AC%AC%EF%BC%93%E7%AB% A0-% E3% 82% BD% E3% 83% BC% E3% 82% B9% E3% 82% B3% E3% 83% BC% E3% 83% 89% E3% 82% 92% E3% 82% B3 % E3% 83% B3% E3% 83% 91% E3% 82% A4% E3% 83% AB% E3% 81% 99% E3% 82% 8B)

Recommended Posts

[Für Anfänger] Wo kann überprüft werden, wann eine Klasse zur Kompilierungszeit nicht gefunden werden kann?
Überprüfen Sie die Notizen für die Klasse java.util.Scanner
Überprüfen Sie die Notizen für die Klasse java.util.Optional
Ein Überprüfungshinweis für die Klasse java.util.Objects
[Ubuntu] Was tun, wenn MongoDB aufgrund eines SocketException-Fehlers nicht gestartet werden kann?
Vorläufiges Memo beim Erstellen der CentOS 6-Serie mit VirtualBox
Dinge, auf die Sie beim Erstellen eines Frameworks achten sollten
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
Was tun, wenn das Git-Repository nicht im Azure Team Explorer für Eclipse angezeigt werden kann?