Hinweise zu möglichen Ursachen bei Problemen mit dem JDK unter Windows. [] (), Lektion, Seite 721001
https://www.purl.org/stefan_ram/pub/jsdk_problemratgeber_de ist die kanonische URI dieser Seite.
Stefan Ram

Probleme mit dem JDK  unter Windows

Einer der häufigeren Fehler ist ein Syntax-Fehler im Quelltext.

command
C:\user\hans>javac Hallo.java
Hallo.java:3: Invalid declaration. 
{ System out.print( "Hallo!" ); }} 

1 error

Übungsaufgabe Wo steckt der Fehler in der angezeigten Anweisung?

Übungsaufgabe+ Erzeugen Sie an einer Stelle in einer Übersetzungseinheit einen Fehler, indem Sie z.B. ein Zeichen löschen oder hinzufügen. Beobachten Sie, wie der Compiler diesen Fehler meldet.

Mögliche Probleme

Wenn andere Probleme auftreten als die Meldung eines Syntax-Fehlers, dann sollte folgende Liste beachtet werden, die die häufigsten Probleme bei der Arbeit mit dem JDK  erklärt:

Suchpfadliste Die Suchpfadliste des Kommandointerpretierers muß so erweitert worden sein, daß die Java -Kommandos gefunden werden. Ist dies nicht geschehen, so erscheint eine Meldung wie "Befehl oder Dateiname nicht gefunden.".

Groß- und Kleinschreibung Die Groß- und Kleinschreibung muß beim Abschreiben des Programmes und der Kommandozeilen übernommen werden.

Dateiname Der Name der Quelldatei (z.B. der Dateiname "Hallo.java") muß mit dem Namen der definierten öffentlichen Klasse (z.B. dem Klassennamen "Hallo") plus der Zeichenfolge ".java" übereinstimmen.

Datei Die Quelldatei muß im aktuellen Verzeichnis vorhanden sein. Zur Kontrolle kann man das Kommando "dir /p" verwenden.

Kommandos Beide Kommandos "javac" und "java" müssen in dieser Reihenfolge verwendet werden. Wenn der Aufruf von "javac" vergessen wird und nach einer Veränderung des Quelltextes gleich "java" aufgerufen wird, kann es sein, daß dieses trotzdem zu einer Programmausführung führt, so daß der Fehler nicht gleich auffällt, weil dann ein früheres Kompilat ausgeführt wird. An diese Möglichkeit sollte gedacht werden, wenn eine neu im Quelltext eingeführte Änderung zu keiner Änderung im Programmverhalten bei der Ausführung führt.

javac Beim Aufruf von "javac" muß der vollständige Dateiname einschließlich der Dateinamenserweiterung ".java" (z.B. der Dateiname "Hallo.java") angegeben werden.

java Beim Aufruf der Java-Maschine mit dem Kommando "java" muß der Klassenname (z.B. "Hallo") angegeben werden. Es darf also kein Dateiname (wie der Dateiname "Hallo.java" oder der Name "Hallo.class") verwendet werden. Unterverzeichnisse Wenn man Java-Quelldateien in ein Unterverzeichnis legt, dann sollte man vor der Übersetzung und Ausführung in dieses Unterverzeichnis wechseln. Wird der Übersetzer statt dessen mit der Angabe eines Unterverzeichnisses aufgerufen (z.B. mit "javac sub/Hallo.java"), so kann dies zur Interpretation der Verzeichnisstruktur als Paketstruktur führen. Wenn der Programmierer mit der Paketstruktur von Java noch nicht vertraut ist, dann wird dies wohl so nicht beabsichtigt sein und zu Fehlern führen. Es darf also kein Pfad, wie beispielsweise der Dateipfad "C:\source\Hallo" als Argument von des Kommandos "java" verwendet werden. Liegt eine Klasse (ohne Paketdeklaration) in einem Verzeichnis, so ist dieses vielmehr zunächst als aktuelles Verzeichnis festzulegen oder als Argument der Option "-cp" anzugeben, wie beispielsweise in dem Kommando "java -cp C:\source Hallo".

CLASSPATCH Wenn die Umgebungsvariable "CLASSPATH" definiert wurde, sollte das aktuelle Verzeichnis "." darin aufgenommen werden. (Dies kann manchmal durch den Aufruf "java -cp . Hallo" noch geheilt werden.) Die Definition einer solchen Umgebungsvariablen soll aber vermieden werden. Statt dessen kann bei Bedarf das entsprechende Kommandoargument verwendet werden. (Die Umgebungsvariable "CLASSPATH" kann mit "set CLASSPATH=" gelöscht werden.)

Dateiname Manche Editoren, wie beispielsweise Notepad, erweitern Namen zu speichernder Dateien unter bestimmten Umständen mit der Endung ".txt". Soll dann eine Datei "Hallo.java" abgespeichert werden, so wird diese dann als "Hallo.java.txt" gespeichert. Das wird vom Windows-Explorer  manchmal nicht richtig angezeigt, dieser zeigt die Datei »Hallo.java.txt« manchmal als »Hallo.java« an, so daß der Fehler unbemerkt bleibt. Der richtige Dateiname kann aber von dem Kommandozeilenfenster mit dem Kommando »dir Hallo.*« angezeigt werden oder durch Eingabe von »type Hallo.java« kontrolliert werden. Ein falscher Name kann dann bei Bedarf mit dem Kommando "ren Hallo.java.txt Hallo.java" in den gewünschten Namen "Hallo.java" geändert werden. Oft kann ein bestimmter Dateiname wörtlich verlangt werden, indem dieser beim Speichern-unter-Dialog in Anführungszeichen geschrieben wird, also beispielsweise als »"Hallo.java"«.

java.lang.NoClassDefFoundsError Diese Fehlermeldung erscheint, wenn der Java-Klassenlader eine benötigte Klasse nicht findet. Einige mögliche Ursachen für diese Fehlermeldung sind: Nach dem Aufruf von "java" wurde nicht der Name einer Klasse angegeben (Hier muß gegebenenfalls auch der richtige Paketname vorangestellt werden, doch sollte dies beim dem ersten Programm nicht nötig sein, weil dies keine Paketdeklaration enthalten sollte). Eine Klassendatei war nicht intakt. Die Variable "classpath" wurde fehlerhaft eingestellt: Diese Variable sollte entweder gar nicht gesetzt werden oder das aktuelle Verzeichnis "." enthalten.

subst Es sollten bei der Arbeit mit dem JDK nur normale Windows-Verzeichnisse verwendet werden, aber keine mit dem Kommando "subst" erzeugte Verzeichnisnamen.

leere Quelldatei Wenn der Java -Übersetzer eine leere Quelldatei erhält, dann akzeptiert er diese ohne Fehlermeldung, erzeugt aber keine Klassendatei.

Klassendatei Wenn eine vom Programmierer erstellte Klasse den Namen "String" hat (dann findet man die Datei "String.class" im Verzeichnis mit der Quelldatei), so ändert dies die Interpretation von "String" im Quelltext "main( String[] args )" und es erscheint eine Fehlermeldung, in der Java  eine fehlende Methode "main" meldet (z.B. »Exception in thread "main" java.lang.NoSuchMethodError: main«). In diesem Fall ist der Quelltext praktisch richtig (wenn auch nicht ganz robust). Das Problem kann dadurch gelöst werden, daß an Stelle des Quelltexts "main( String[] args )" der Quelltext "main( java.lang.String[] args )" verwendet wird oder dadurch, daß die Klasse mit dem Namen "String" umbenannt und die Datei "String.class" entfernt wird.

Paketdeklaration Das erste Hallo-Programm sollte keine Paketdeklaration (»package ...«) am Anfang enthalten.

Prüfungen auf der Kommandozeile

Dieser Abschnitt zeigt Kommandos, die man auf der Kommandozeile unter Microsoft ® Windows  in der hier gegebenen Reihenfolge eingeben kann, um einzelne Voraussetzungen für eine korrekte Übersetzung und Ausführung zu prüfen. Durch diese Prüfungen kann vielleicht die Ursache eines Problems gefunden werden.

In dem Kommandofenster wechsle man zunächst in das Verzeichnis mit der Quelldatei »Hallo.java«.

Prüfung 0 Die Ausgabe von »echo %CLASSPATH%« sollte sein »ECHO ist eingeschaltet (ON)« oder eine andere Ausgabe, die zeigt, daß die Umgebungsvariable »CLASSPATH« nicht definiert ist. Diese Umgebungsvariable sollte bestenfalls nicht definiert sein oder wenigstens das aktuelle Verzeichnis (».«) enthalten.

Fehlerbehandlung 0 Falls diese Umgebungsvariable definiert ist, sollte man sie unter Windows 98  mit »SET CLASSPATH=« löschen. (Unter Windows XP  mit dem entsprechenden Dialog in der Systemsteuerung.)

Prüfung 1 Nach Eingabe von »javac -version« und »java -version« sollten die erwarteten (zuletzt installierten) Versionen dieser Programme angezeigt werden. Falls statt dessen eine Meldung wie »Befehl oder Dateinamen nicht gefunden« erscheint oder eine andere als die erwartete Programmversion erscheint, so ist der Suchpfad für diese Kommandos nicht richtig eingestellt worden.

Fehlerbehandlung 1 Bei diesem Pfad handelt es sich nicht  um die Variable »CLASSPATH«, sondern um die Variable »PATH«. Diese muß eine Liste von durch Semikolon getrennten Verzeichnispfaden enthalten. In dieser Liste sollte das Verzeichnis mit dem Java -Compiler »javac.exe« und dem Java-Ausführer »java.exe« sein und auch das Verzeichnis mit den üblichen Systemkommandos, wie dem Kommando »xcopy.exe«. Diese Variable kann mit dem Windows-Kommando "PATH" und unter neueren Windows-Versionen mit der Systemsteuerung (als Systemvariable oder Benutzervariable) festgelegt werden.

Nach Eingabe von »type Hallo.java« sollte der richtige Quelltext erscheinen.

Nach Eingabe von »javac Hallo.java« sollte dieser Quelltext dann übersetzt werden. Dabei erscheint im allgemeinen keine weitere Ausgabe. Erscheinen hier Fehlermeldungen sollten diese einen Hinweis auf die Natur des Problems geben.

Nach anschließender Eingabe von »dir Hallo.class« sollte dann die Datei »Hallo.class« mit einer nur wenige Sekunden alten Uhrzeit angezeigt werden.

Die Anzeige dieser Klassendatei mit »javap Hallo« sollte dann die richtige Klasse anzeigen.

Nach Eingabe von »dir *.class« sollte nur  die Datei »Hallo.class« angezeigt werden. Weitere vorhandene Klassendateien sollten in ein anderes Verzeichnis verschoben werden (sie können wahrscheinlich auch gelöscht werden).

Daraufhin sollte die Klasse »Hallo« mit dem Kommando »java Hallo« gestartet werden können.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Von der Stefan-Ram-Startseite ausgehend finden sich oft noch mehr Informationen zu Themen, die auf einer Seite angesprochen wurden. (Eine Verbindung zur Stefan-Ram-Startseite befindet sich ganz oben auf dieser Seite.)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. slrprd, PbclevtugFgrsnaEnz