1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

neues Problem: unerklärlich...Exception in thread "main" java.lang.NoClassDefFoundErr

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Cyrics, 19.06.06.

  1. Cyrics

    Cyrics Neuer Berner Rosenapfel

    Dabei seit:
    01.04.05
    Beiträge:
    1.975
    Ähm... ich glaub ich verzweifel ein bisschen mit Java ;)

    Also wie in diesem Thread schon geklärt, hab ich ein Package mit einer Oberklasse und einer von dieser abgeleiteten Unterklasse erstellt.

    Nun hab ich eine neue Datei geschrieben um die Klasse Auto zu benutzen.
    Daher wird erstmal das Package mit allen Unterpaketen importiert und dann eine main-Funktion genutzt.
    Ich erzeuge ein neues Objekt, welches eine Instanz von Auto ist und dann soll eben mit dem Ablauf von der Klasse Auto gearbeitet werden. Kompilierung klappt wunderbar... aber Ausführung?

    Denkste...
    Fehlermeldung:
    Der Quelltext sieht folgendermaßen aus:
    Code:
    //  Created by Torsten on 19.06.06.
    //  Copyright 2006. All rights reserved.
    //
    import fahrzeug.*;
    
    public class Test 
    {
    	public static void maein(String[] args)
    	{
    		Auto ein_auto;
    		ein_auto = new Auto();
    		if (ein_auto.eingeben())
    			ein_auto.anzeigen();
    		else
    			System.out.println("Fehlerhafte Eingabe!");
    	}
    }
    
    Zeile 11 wäre die Zeile wo der new-Operator genutzt wird.
    Ich hab Strassenfahrzeug, Auto und Test alle im selben Verzeichnis. Kompiliert hab ich nun vom über geordneten Verzeichnis und Aufruf hab ich so ziemlich von jedem Verzeichnis aus *g*
     
  2. klogg

    klogg Gast

    Ich habe zwar kaum Java-Kentnisse
    aber dafür C++.
    Und zumindest dort liefer der "new" Befehl eine Adresse zurück.
    (Die vom neu erzeugten Speicherbereich)
    Du weist diese Adresse aber einem fertigen Objekt zu, keinem Zeiger.
    ("Auto ein_auto" statt "Auto * ein_auto")
    In C/C++ wäre das falsch, wie's in Java aussieht weiß ich nicht.

    klogg
     
  3. Intenso

    Intenso Süssreinette (Aargauer Herrenapfel)

    Dabei seit:
    18.04.06
    Beiträge:
    405
    Exception in thread "main" java.lang.NoClassDefFoundError: fahrzeug/Auto
    at Test.main(Test.java:11)

    das bedeutet soviel wie: Er kann das Objekt Auto nicht erzeugen, da er nicht darauf zugreifen kann.
    Jetzt ist die Frage:
    wie hast du die Klasse Auto geschrieben, ist sie vielleicht "protected" und deine "Main-Methode" nicht im selben Packet, was ich vermute, da du "Fahrzeug.*" importierst.
    dann ändere das Protected bei Auto auf Public und es wird funktionieren.

    Für genaueres Debugging wäre der Code der Class Auto interessant.

    mfg
    Intenso
     
  4. Cyrics

    Cyrics Neuer Berner Rosenapfel

    Dabei seit:
    01.04.05
    Beiträge:
    1.975
    also der genaue Auto-Code ist oben verlinkt im anderen Thread.
    Aber hier ist sonst noch einmal der direkte Link zu dem Beitrag mit den Quelltexten.

    Auto ist als public deklariert. Einzig und allein die Oberklasse hat zwei protected Variablen deklariert, wobei dann der Fehler aber wohl ein anderer wäre, oder?

    @klogg
    also da unterscheidet sich java einfach von c++. Gott sei Dank ;)
    von der Programmierung her find ich Java da wesentlich einfacher... auf jeden Fall fällt diese Pointer-Geschichte bei Java weg :) es wird nur ein Datentyp sozusagen übergeben und dann ein neues Objekt von der Klasse iniziiert.

    PS:
    ICH HABS GESCHAFFT!
    Ich hasse den Java-Compiler... ich hasse ihn einfach... also meine Test.java durfte nicht ins selbe Verzeichnis, sondern in das übergeordnete um das Package fahrzeug.* importieren zu können, welches ja dann sozusagen der Ordner war ;)
    Von der Logik her... naja... also wenn man langsam diese Macken von dem Compiler verstanden hat...

    dann geht die Zeitplanung wohl immer dahin: 1 Stunde Quelltext schreiben, 1 Tag Fehlersuche aufgrund von Compiler-Macke.
     
  5. Demo

    Demo Süssreinette (Aargauer Herrenapfel)

    Dabei seit:
    02.04.04
    Beiträge:
    411
    Sorry, aber das hat mit dem Compiler nix zutun. Es ist eher so, dass Du das Package Prinzip nicht verstanden hast. Wenn Du schon das Package fahrzeug importierst, dann muss zwingend gegeben sein, dass sich die Klasse, die das Package importiert nicht im selben Ordner befindet. Das hast Du ja schon selbst geschrieben. Das Du das nicht gemacht hast, dafuer kann der Compiler ja nix.

    Das ist immer so, wenn man eine Sprache neu lernt. Java != C++, auch wenn es da Gemeinsamkeiten gibt. Darauf sollte man sich auch einstellen. Das Prinzip der Namensraeume bei C# ist ja auch ein voellig anderes als das Package Prinzip bei Java, obwohl die Sprachen sich schon sehr aehneln.
     
  6. slayercon

    slayercon Meraner

    Dabei seit:
    17.01.05
    Beiträge:
    231
    2 Tipps zu Java :
    1.)
    Deine Klasse Test.java hat keine package Deklaration das ist schlechter Stil den nichts sollte im default package liegen.

    2.) Wenn dich javac so nervt (was ich verstehen kann), du aber keine IDE verwenden willst solltest du einfach ANT beutzen um zu kompilieren/builden.

    ANT ist das (IMHO verbesserte) JAVA Gegenstück zu make.
     
  7. Cyrics

    Cyrics Neuer Berner Rosenapfel

    Dabei seit:
    01.04.05
    Beiträge:
    1.975
    Nicht alles was ich hasse oder was schlecht ist, ist automatisch schuld! ;)
    Eigentlich fast immer ist es der Benutzer vor der Tastatur... und ja... dafür, dass ich mich gerade mal eine Woche damit beschäftige, finde ich, dass ich bei Java relativ weit bin und wenn ich dann wegen solchen Kleinigkeiten hängen bleibe, ist das einfach frustrierend ;) (das muss man doch irgendwie zum Ausdruck bringen *g*)
    Man sollte eigentlich auch schon gemerkt haben, dass ich java sehr mag, gerade weil es nicht wie C++ ist, welches ich wohl nie mehr anrühren werde. So langsam ist das mit dem package auch verinnerlicht, und je mehr Fehler man macht, desto schneller lernt man (hoffentlich) *g*

    also wie dem auch sei... nicht alles so ernst nehmen :p

    @slayercon
    zu erst zu zweitens:
    ich finde meine derzeitige Terminal-Java-Lösung eigentlich sehr gut. Ich bin froh, dass ich mich nur auf das grundlegende Beschränke.
    dann zu erstens:
    wieso schlechter Stil? Ich brauch doch bloss eine Testdatei, die mein erzeugtes Package verwendet. Welchem Package sollte ich dieser Testdatei denn zuordnen?
    package test;?!
    Ich denk das ist vollkommen unrelevant... alle Klassen die zu meinem package Fahrzeug gehören, werden auch selbstverständlich diesem package zugeordnet. Alles was nicht dazu gehört importiert nun mein package fahrzeug. Und erhält selbstverständlich auch kein neues package, weil das in meinen Augen keinen Sinn ergibt.
     
  8. slayercon

    slayercon Meraner

    Dabei seit:
    17.01.05
    Beiträge:
    231
    Das mit den packages ist nun mal Konvention so wie großgeschriebene Klassennamen.

    Java ist die Sprache des Internets du kannst wenn du willst deine Domain als package verwenden
    zb at.kwmedia.xxx etc

    :) Sogar Eclipse sagt : "The use of default packages is discouraged"

    aber nix für ungut wollte dich nur darauf hinweisen wie du es machst is schlussendlich deine Sache

    lg S.
     
  9. Cyrics

    Cyrics Neuer Berner Rosenapfel

    Dabei seit:
    01.04.05
    Beiträge:
    1.975
    aber ehrlich, ich hab das mit den package selber erst seit gestern genutzt und es auch vorher nie bei jemanden gesehen. Und so wie es bekannt scheint, scheint es ja doch eher selten benutzt zu werden. Kommt mir zumindest nur so vor... ich halt mich auf jeden Fall dran und packe die Dateien, die auch zusammen gehören in ein package... versprochen :-D
     
  10. slayercon

    slayercon Meraner

    Dabei seit:
    17.01.05
    Beiträge:
    231
    Und wenn du mal ein Projekt mit hunderten Klassen hast wirst du es mir danken :)
     

Diese Seite empfehlen