2 Stimmen

Programm kompiliert gut, stürzt aber mit NoClassDefFoundError ab

Ich habe fünf Klassen geschrieben, die, kurz gesagt, dem Zweck dienen, eine grafische Benutzeroberfläche zu erstellen und Teilnehmer für eine Konferenz zu erfassen. Ich habe Panels gebaut und sie hinzugefügt, FocusListeners, ActionListeners, ItemListeners.

Soweit ich das beurteilen kann, hängt die Meldung, die ich beim Absturz erhalte, mit meinem Klassenpfad zusammen, aber ich weiß nicht wirklich, wie ich das Problem beheben kann. Hier ist der Code, wo der Absturz stattfindet (es ist, wenn ich die ActionListeners für die beiden Schaltflächen für mein Panel hinzufügen:

private void buildButtonPanel()
{
   //create the buttonpanel
   buttonPanel = new JPanel(new FlowLayout());
   //create the buttons
   calculate = new JButton("Calculate Charges");
   clear = new JButton    ("Clear");
   //add listeners to the buttons
   ConferenceHandler handler = new ConferenceHandler(this);
   calculate.addActionListener(handler);             //crash occurs on this line
   clear.addActionListener(handler);
   //create a text area
   JTextArea textArea = new JTextArea(5,30); 
   textArea.setLineWrap(true); textArea.setWrapStyleWord(true);
   //add a scrollbar to the textarea
   JScrollPane scroll = new JScrollPane (textArea);
   //add everything to the buttonpanel
   buttonPanel.add(calculate); buttonPanel.add(clear); buttonPanel.add(scroll);
}

Die Absturzmeldung, die ich erhalte:

java.lang.NoClassDefFoundError: ConferenceHandler
    at ConferenceGUI.buildButtonPanel(ConferenceGUI.java:63)
    at ConferenceGUI.<init>(ConferenceGUI.java:33)
    at IsItWorking.<init>(IsItWorking.java:16)
    at IsItWorking.main(IsItWorking.java:28)
Caused by: java.lang.ClassNotFoundException: ConferenceHandler
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
    at ConferenceGUI.buildButtonPanel(ConferenceGUI.java:63)
    at ConferenceGUI.<init>(ConferenceGUI.java:33)
    at IsItWorking.<init>(IsItWorking.java:16)
    at IsItWorking.main(IsItWorking.java:28)
    at __SHELL0.run(__SHELL0.java:6)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at bluej.runtime.ExecServer$3.run(ExecServer.java:774)

Ich weiß, dass es hier eine Menge Leute mit viel Erfahrung gibt, und ich kann im Internet keine Hilfe dazu finden.

4voto

Stephen C Punkte 665668

Um Java mitzuteilen, wo ConferenceHandler zu finden ist (und ich entschuldige mich dafür, dass ich mich dumm anhöre - Hausaufgabenfragen werden von Neulingen gestellt), verwende ich Blue Jay, und alles, was ich tun muss, ist, auf das Hauptmenü zu klicken, und das Programm läuft. Ich habe keine Ahnung, wie man das von der Kommandozeile aus macht.

Der richtige Ort zum Nachschlagen ist die Dokumentation für das Programm java Befehl; z.B. aquí . Achten Sie besonders auf den Teil, der sich mit dem Klassenpfad und den verschiedenen Möglichkeiten, ihn zu setzen, befasst. Lesen Sie auch diese Seite .


Ich erkannte, dass es ein Problem mit dem Klassenpfad war, und egal, was ich tat, ich konnte es nicht beheben. Also nahm ich alle ursprünglichen Klassen und fügte sie alle in einen neuen Ordner ein, und es funktionierte wie ein Zauber.

Das ist eine Voodoo-Lösung. Sie müssen das Problem wirklich verstehen.

Lassen Sie uns zu diesem Zweck noch einmal auf einige der obigen Bemerkungen zurückkommen:

Der Stacktrace zeigt etwas anderes an. Sie sind packageless (mit anderen Worten, in der Standard-Paket, wenn BlueJ sagt, dass Sie buchstäblich irgendwie). - @BalusC

Ich wünschte, ich wüsste, was das bedeutet..... - @Einheit

Was @BalusC meint, ist, dass der Stack-Trace den vollständigen Namen der Klasse angibt, die zu laden versucht wurde.

    ...
    Caused by: java.lang.ClassNotFoundException: ConferenceHandler
    ...

Und der vollständige Name lautet (in diesem Fall) ConsoleHandler ... nicht some.pkg.ConsoleHandler .

Es ist nicht ganz klar, warum dies der Fall ist, aber ich Verdächtige dass Sie tatsächlich die alten .class Dateien, die nicht mit dem Quellcode übereinstimmten, den Sie sich angesehen haben. Und Ihre Voodoo-Lösung könnte dies durchaus "behoben" haben, indem Sie die alte .class Dateien mit neuem Material. Aber wenn das der Fall ist, müssen Sie verstehen, was mit der Art und Weise, wie Sie bauen / bereitstellen, falsch ist. Andernfalls werden Sie immer wieder über diese Art von Dingen stolpern.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X