Frage: NoClassDefFoundError
-
hi
Ich bin Java Anfänger und habe eine Frage:
Auf der Seite http://java.sun.com/docs/books/tutorial/uiswing/learn/example1.html habe ich ein kleines HelloWorld Beispiel gefunden. Den Code habe ich kopiert und in NetBeans 4.1 eingefügt. Den Klassennamen habe ich nach "Main" abgeändert.
Compilation und Ausführung ergaben im NetBeans keine Errors und das Programm konnte ausgeführt werden.
Wenn ich jedoch die Klasse direkt mit dem javac.exe kompiliere und mit java.exe "Main.class" auszuführen versuche kommt immer: "Exception in thread "main" java.lang.NoClassDefFoundError". Komischerweise funktioniert genau derselbe Code wenn ich es im Netbeans ausführe.
Kann mir bitte jemand erklären wie es dazu kommt? Wie kann ein Kollege nun die Applikation starten, wenn er nur die Runtime installiert hat?Ich habe noch eine zweite Frage die auf der oberen basiert:
Der Compiler erzeugt aus der "Main.java" immer eine "Main.class" und eine "Main$1.class". Was genau ist denn die Zweite? (die mitem $)
Vielen Dank für eure Antworten
Steffe
-
Kann es sein, dass du vergessen hast den CLASSPATH zu setzen?
Er sollte folgender Maßen aussehen:
E:\jre1.5.0\lib\rt.jar;.
Also für das "E:\jre1.5.0" musst du halt entsprechend den Pfad deiner JRE-Installation einsetzen. Ich bin mir immernoch nicht sicher, ob ersteres überhaupt nötig ist, da ich gehört/gelesen habe, das sei es nicht mehr.
Aber doppelt hält besser.
Du darfst auch den Punkt nicht vergessen, dieser bedeudeutet, dass auch im aktuellen Verzeichnis nach Klassen gesucht wird.Der CLASSPATH ist eine Umgebungsvariable. Mit Windows XP kannst du sie ganz einfach erstellen/verändern indem du das Arbeitsplatz-Symbol auf dem Desktop rechtsklickst und dann auf Eigenschaften klickst und dann auf Erweitert klickst. Da ist dann ein Knopf für Umgebungsvariablen.
Wenn du eine ältere Version von Windows benutzt kannst du auch einfach folgendes in die C:\autoexec.bat eintragen:
SET CLASSPATH = E:\jre1.5.0\lib\rt.jar;.;%
-
hi Pogo
Danke für deine Antwort.
Das Problem liegt anscheinend beim Aufruf in der Konsole (FAQhttp://www.c-plusplus.net/forum/viewtopic-var-t-is-41398.html)
Jedoch nur die Endung wegzulassen hatte bei mir nicht gereicht. Der Prompt musst sich auch noch im gleichen Verzeichnis befinden wie die Datei selbst, sonst wurde die Exception auch ausgelöst...
Ich habe noch eine Frage zu diesen .class Dateien:
Der Compiler erstellt ja 2 Dateien pro Klasse "Main.class" und "Main$1.class". Die Frage ist nun, für was die zweite Datei "Main$1.class" erstellt wird. Was beinhaltet diese?
Danke für eure Mühe
Steffe
-
Was kommt denn für eine Fehlermeldung wenn du 'java -cp . Main' eingibst?
-
hi CengizS
Die Frage hat sich geklärt. (habe den vorherigen Eintrag editiert)
Meine Frage mit den zwei Dateien steht jedoch noch
-
Wahrscheinlich hast du in deiner Main.java zwei Klassen definiert. Eine Main und eine weitere anonyme Klasse - daher auch das $1-Konstrukt. Das ist so absolut in Ordnung
Anonyme Klassen verwendet man gerne bei Event-Handlern. Z.B.
myFrame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { // do anything when closing } });
Dabei wird eine anonyme Klasse gebastelt die von WindowAdapter abgeleitet ist und die einzelne Methode windowClosing(...) enthält.