Announcement

Collapse
No announcement yet.

Nochmal NoClassDefFoundError!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Nochmal NoClassDefFoundError!

    Tagchen erstmal,

    ich habe zwei Pakete geschachtelt und möchte von einer externen Klasse darauf zugreifen. Dabei greift die äußere Paketklasse auf die innere zu und die externe auf die äußere. Soll jedenfalls, klappt aber nicht. Ich hab mal noch ein Bsp. meines Problems hier drunter kopiert:

    // die externe Klasse
    import pack1.*;
    import java.io.*;

    public class Main {
    public static void main(String args[])
    throws IOException {
    P1 pa1 = new P1();
    pa1.out1();
    }
    }

    // die äußere Package-Klasse
    package pack1;

    import pack2.*;
    import java.io.*;

    public class P1 {
    public static void out1()
    throws IOException {
    P2 pa2 = new P2();
    pa2.out2();
    }
    }

    // die innere Package-Klasse
    package pack2;

    import java.io.*;

    public class P2 {
    public static void out2()
    throws IOException {
    System.out.print("Hossa");
    }
    }

  • #2
    Hallo M.,<p>
    innere und aeussere Packages gibt es in Java gar nicht, ein package hat immer einen Pfad, der es beschreibt: package pack1.pack2; wuerde das innere Package pack2 beschreiben, und gleichzeitig klarstellen, dass es ein Teil von pack1 ist. Jede Klasse ist also IMMER durch einen package-Pfad darstellbar, egal auf welche Art und Weise die Klassen letztlich im Classpath gefunden werden, ob als JAR oder als *.class-Dateien.<p>
    Dazu kommt, dass es bei eigenen Packages nicht reicht, nur die package-Anweisungen hineinzuschreiben. Du musst die Packages aus einem Verzeichnis heraus kopieren, welches relativ zu dem Package-Namen angeordnet ist, und bei Deiner "externen" Klasse muss Dein Package halt gefunden werden.<p>
    Wenn Du beim javac den Parameter -verbose mal aktivierst, kriegst Du eine Vorstellung, was bei einfachen Programmen alles aus der JDK-Klassensammlung eingebunden wird.<p>
    Bei Deinem Beispiel waere das so:
    <pre>
    mkdir pack1;
    mkdir pack1/pack2;
    edit pack1/pack2/P2.java; (wo drinsteht package pack1.pack2
    edit pack1/P1.java; (wo drinsteht package pack1; import pack1.pack2.P2
    edit Main.java (wo drinsteht import pack1/P1
    javac pack1/pack2/P2.java
    javac pack1/P1.java
    javac Main.java
    java Main
    </pre><p>
    Ich geb zu, ist etwas verwirrend. Falls es zu konfus ist, frag mich per Live-Nachricht.<p>
    Gruss, Marc

    Comment


    • #3
      Hallo Marco,

      danke für die schnelle Antwort. Bei mir hat´s ein bisschen länger gedauert. Ich hab das mal so gemacht, wie du es beschrieben hast. Leider gibts schon wieder Fehlermeldungen, diesmal schon beim Kompilieren!

      package pack1.pack2;

      import java.io.*;

      public class P2 {
      public static void out2() throws IOException {
      System.out.print("Hossa");
      }
      }
      ----------------------------------------

      package pack1;

      import pack1.pack2.*;
      import java.io.*;

      public class P1 {
      public static void out1() throws IOException {
      P2 pa2 = new P2();
      pa2.out2();
      }
      }
      ------------------------------------------------

      Fehlermeldung beim Kompilieren P1.java:
      package pack1.pack2 does not exist

      Hab ich dich vielleicht falsch verstanden?

      CU, Mari

      Comment


      • #4
        Hallo Mario,<P>
        Dein geposteter Code laesst sich bei mir genau so, wie er ist, uebersetzen. Wahrscheinlich liegt es daran, dass vom falschen Directory aus uebersetzt:<p>
        Wenn Du P2 compilieren willst, musst Du 2 Verzeichnisse drueber sein: javac pack1\pack2\P2.java, und bei P1 genau ein Verzeichnis drueber: javac pack1\P1.java, wobei er ueber import pack1.pack2.* stolpert und diesen "Pfad" vom Compiler-Aufruf-Verzeichnis her sucht (beziehungsweise vom Classpath, indem das aktuelle Verzeichnis ja sicher drin steht).<p>
        Das alles macht Sinn, wenn Du noch ein Hauptprogramm hast, welches auch pack1 einbindet. Zum Compilieren ist es zugegebenermassen umstaendlich, aber zum Wiederverwenden von Code aus anderen Projekten zusammen mit dem Class-Loader, der in mehreren Verzeichnissen sucht, ist es eine sinnvolle Erfindung.<p>
        Fazit: Packages machen nur Sinn, wenn man an groesseren Projekten arbeitet oder wenn man vorhandenen Code "archivieren" fuer weitere Projekte will. Je weniger importierte Packages neu compiliert werden, umso sinnvoller sind sie. Neben dem Klassendesign ist also auch das Package-Design letztlich eine Frage von Talent und nicht nur von Wissen.<p>
        Gruss, Marc

        Comment


        • #5
          Hallo Marco,

          danke nochmal, jetzt hat es funktioniert! Ich hatte vom jeweiligen package-Ordner aus kompiliert, das war der Fehler!

          CU, Mario ..

          Comment

          Working...
          X