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


Anmelden zum Antworten