NoClassDefFoundError - Exception in meiner Klasse
-
Ich habe folgendes Programm, welches aus 2Klassen besteht, jedoch bekomme ich
nachdem starten folgende Exception:java.lang.NoClassDefFoundError: ParseFile
at Aktienkurs.init(Aktienkurs.java:19)
at sun.applet.AppletPanel.run(AppletPanel.java:353)
at java.lang.Thread.run(Thread.java:534)Hier der Quelltext
/* * @(#)Aktienkurs.java 1.0 04/05/03 * * Liest Aktienkurse aus einer Datei aus und gibt diese aus. * */ import java.awt.*; import java.io.*; import java.net.URL; import java.applet.*; public class Aktienkurs extends Applet { public void init () { ParseFile pf = new ParseFile (getParameter ("filename")); TextArea lab = new TextArea (); String str[] = pf.readFile (); for (int i = 0; i < str.length; i++) lab.append (str[i] + "\n"); setLayout (new FlowLayout ()); add (lab); } } // Liest eine Datei Zeilenweise ein und speichert diese in einem String-Array // Voraussetzung ist, dass in der ersten Zeile die Anzahl der folgenden Zeilen // steht! class ParseFile extends Applet { // Speichert den Dateinamen String filename; // Objekt mit Dateinamen erzeugen public ParseFile (String filename) { open (filename); } // Öffnet ein anderes Dokument, wobei das Dokument erst später geöffnet wird public boolean open (String filename) { this.filename = filename; return true; } // Schließt das aktuelle Dokument, wobei das Dokument bereits geschlossen ist // Nur der Dateiname wird gelöscht public boolean close () { filename = ""; return true; } // Liest das Dokument in ein Stringarray ein, wobei jede Zeile für ein Element // Des Stringarrays steht public String[] readFile () { // Stringarray für die Zeilen, größe noch unbekannt String StringFile[]; // Stream öffnen try { URL url = new URL (getDocumentBase (), filename); InputStream stream = url.openStream (); BufferedReader file = new BufferedReader (new InputStreamReader (stream)); // Makiert das Dateiende boolean eof = false; while (!eof) { int lines; // Versuche die Anzahl der Zeilen einzulesen (steht in der ersten Zeile) try { lines = Integer.parseInt (file.readLine ()); } catch (NumberFormatException nfe) { return null; } StringFile = new String[lines]; for (int i = 0; i < lines; i++) { StringFile[i] = file.readLine (); // Ende erreicht if (StringFile[i] == null) eof = true; } } } catch (Exception e) { return null; } // Das Stringarray zurückgeben return StringFile; } }
Ich verstehe nicht was zu diesem Fehler führt, kenne mich mit Java nicht so super aus
und ein Blick in die Doku konnte mir leider auch nicht helfen zu erkennen was ich falsch gemacht habe.Edit:
Hoppla, CPP statt Java Tags verwendet
-
Hi,
1.: Das ParseFile von Applet abgeleitet wird ist quatsch, oder?
2.: Mach ParseFile zu einer inneren Klasse von Aktientkurs,
oder pack sie in eine eigene Datei und mach sie public.Jockel
-
Jockelx schrieb:
Hi,
1.: Das ParseFile von Applet abgeleitet wird ist quatsch, oder?
2.: Mach ParseFile zu einer inneren Klasse von Aktientkurs,
oder pack sie in eine eigene Datei und mach sie public.Jockel
Ok, hab ich gemacht, allerdings ändert das nichts an meinem Problem
Edit:
Ich habe den Fehler, es lag daran, dass String StringFile[]; mir einen
error lieferte, dass es nicht zwingend initialisiert sein muss, ich dachte,
aber das wäre nur ne Warnung und kein richtiger Fehler, somit ist klar weshalb
es nicht funktionierte.
-
Ich hätte da noch ne Kleinigkeit, ich kann mit meiner Klasse zwar wunderbar
Dateien einlesen, allerdings muss ich beim ausgeben immer auf null prüfen,
wie kann ich das anderst lösen, z.B. mit exceptions, statt einem "return null"
wenn ein Fehler auftritt. So könnte ich das erste if weglassen und ein try-catch
Block benutzen.Das zweite wäre wie ich ermitteln kann wieviele Elemente im zurückgelieferten
Array einen Wert haben ohne auf null zu prüfen. Soll ich in der Klasse ein
kleineres Array erstellen und die Werte dorthinein kopieren, wenn die Zahl
für "lines" größer angegeben wurde als es Zeilen in der Datei gibt, oder gibt
es einen anderen Weg?Edit:
Da ich nicht einfach in Ruhe warten konnte, hab ich selbst weitergebastelt und das
mit den Exceptions so gelöst, könnt ihr nen kurzen Blick drauf werfen und mir sagen
ob das so OK ist?/* * @(#)Aktienkurs.java 1.0 04/05/03 * * Liest Aktienkurse aus einer Datei aus und gibt diese aus. * */ import java.awt.*; import java.io.*; import java.net.URL; import java.applet.*; public class Aktienkurs extends Applet { public void init () { ParseFile pf = new ParseFile (getParameter ("filename")); TextArea lab = new TextArea (); setLayout (new FlowLayout ()); add (lab); try { String str[] = pf.readFile (); for (int i = 0; i < str.length; i++) { lab.append (str[i] + "\n"); } } catch (Exception str) { lab.append (str.toString ()); } } // Liest eine Datei Zeilenweise ein und speichert diese in einem String-Array // Voraussetzung ist, dass in der ersten Zeile die Anzahl der folgenden Zeilen // steht! class ParseFile { // Speichert den Dateinamen String filename; // Objekt mit Dateinamen erzeugen public ParseFile (String filename) { open (filename); } // Öffnet ein anderes Dokument, wobei das Dokument erst später geöffnet wird public boolean open (String filename) { this.filename = filename; return true; } // Schließt das aktuelle Dokument, wobei das Dokument bereits geschlossen ist // Nur der Dateiname wird gelöscht public boolean close () { filename = ""; return true; } // Liest das Dokument in ein Stringarray ein, wobei jede Zeile für ein Element // Des Stringarrays steht public String[] readFile () throws Exception { // Stringarray für die Zeilen, größe noch unbekannt String StringFile[] = new String[1]; // Stream öffnen try { URL url = new URL (getDocumentBase (), filename); InputStream stream = url.openStream (); BufferedReader file = new BufferedReader (new InputStreamReader (stream)); // Speichert die Anzahl der Zeilen (ohne der ersten in welcher // Die Anzahl steht int lines; // Versuche die Anzahl der Zeilen einzulesen (steht in der ersten Zeile) try { lines = Integer.parseInt (file.readLine ()); } catch (NumberFormatException nfe) { // Anzahl der Zeilen konnte nicht eingelesen werden, wodurch // Eine weitere Bearbeitung nicht möglich ist. throw new NumberFormatException ("Konnte die Anzahl der Zeilen nicht einlesen"); } // Stringarray mit der eingelesenen Größe erstellen StringFile = new String[lines]; for (int i = 0; i < lines; i++) { String tmp = file.readLine (); // Ende erreicht if (tmp == null) { // Falls es weniger Zeilen gab als angegeben, werden die // Eingelesenen Daten in ein kleineres Array kopiert if (i < lines-1) { String temp[] = new String[i]; for (int j = 0; j < i; j++) { temp[j] = StringFile[j]; } // StringFile das neue kleinere Array zuweisen StringFile = temp; } break; } // Zeile in das Stringarray kopieren else { StringFile[i] = tmp; } } } // Wenn die Anzahl der Zeilen nicht eingelesen werden konnte, die // Exception weiterreichen catch (NumberFormatException nfe) { throw nfe; } // Ein Fehler beim öffnen der Datei trat auf catch (Exception e) { throw new Exception ("Konnte Datei nicht öffnen"); } // Das Stringarray zurückgeben return StringFile; } } }
-
Hi!
- Das mit den Exceptions sieht meiner Meinung nach gut aus.
- Das = new String[1]; ist unnötig.
- Statt dem Kopieren der Arrays solltest du vielleicht besser
eine ArrayList oder einen Vector oder sowas nehmen.Jockel
-
Jockelx schrieb:
Hi!
- Das mit den Exceptions sieht meiner Meinung nach gut aus.
- Das = new String[1]; ist unnötig.
- Statt dem Kopieren der Arrays solltest du vielleicht besser
eine ArrayList oder einen Vector oder sowas nehmen.Jockel
zu dem new String[1]: danke für den Hinweis, durch die Exceptions ist es unnötig geworden
zu drittens: Damit kenne ich mich leider nicht aus, deshalb habe ich das jetzt so
gelöst