die-informatiker.net Logo   2452 registrierte Benutzer.
Insgesamt 92546 Beiträge.
Suche
• erweiterte Suche
Login
Benutzername:
Passwort:
• Registrieren
Community
Ein registrierter Benutzer online: maxk

Der Rekord waren 20 angemeldete Benutzer am So 15. Nov 2009, 17.07 Uhr.

Farben: Moderator, Administrator

Lösungsansatz: NoClassDefFoundError

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.
Foren-Übersicht / Softwareentwicklungspraktikum (WS0809)
Autor Nachricht
Thomas K. Ramsauer
Studentenvertreter
Studentenvertreter


Beiträge: 154
Karma: +31

Private Nachricht senden
E-Mail senden

Beitrag Verfasst am: So 19.10.08, 11:07       Titel: Lösungsansatz: NoClassDefFoundError Nach oben

Die vermutlich gefürchteste Fehlermeldung in Java ist der NoClassDefFoundError. Nicht nur deshalb, weil sie nicht Methodenbezogen auftritt, sondern die Ursache eventuell ganz woanders liegt, als vom Stacktrace angegeben, sondern auch deshalb, weil sie sich nicht catchen lässt, auch nicht mit catch(Throwable t).

In den letzten Programmierpraktika war dieser Fehler gerne ein Stolperstrick, der sehr viel Zeit gekostet hat. Da es aber für den typischen Drittsemester meist ein unlösbares Problem ist, für das man die Funktionsweise der Javamaschine kennen muss, gebe ich euch hier einen kleine Lösungsansatz:

Die Fehlermeldung wird erzeugt, wenn irgendwo im Code eine Klasse referenziert wird, die es nicht mehr gibt. Also die es zur Compilezeit noch gab, und zur Laufzeit nicht mehr. Java prüft beim konstruieren einer Klasse aber genau diese Referenzen durch, somit wird der "Horrorfehler" immer beim Konstruieren ausgeworfen.

Wenn viele Leute an Code arbeiten, kann genau das öfter vorkommen. Wie sorge ich nun dafür, dass ich einen catch-Pfad nutzen kann, wenn es eine Klasse nicht mehr gibt? Hierfür besitzt Java das Paket reflection. Das bedeutet auf Deutsch so etwas wie Spiegelung, und sollte von jedem Java-Programmierer zumindest einmal im Javadoc angesehen werden werden. Auch die Klasse Class sollte man sich im Javadoc mal ansehen.

Alter Code:

try {
    Informatiker eins = new Informatiker(this);
} catch(Throwable t) {

Funktioniert NICHT!

Neuer Code:

import java.lang.reflect.*;
import java.lang.Class;
 
[blablabla]
 
try {
    Informatiker zwei = (Informatiker)(Class.forName("de.lmu.personen.Informatiker").getConstructors()[0].newInstance(this));
} catch(Throwable t) {

Funktioniert!

Sieht kompliziert aus, oder? Aber ich will euch ja auch nicht alles verraten, sondern nur einen Weg aufzeigen, der euch aus dieser Krise führen kann. Für Methoden und Variablen sieht es natürlich anders aus, ähnlich zwar... . Tatsächlich austüfteln müsst ihr es natürlich selbst ;)

PS: Solte man natürlich nur benutzen, wenn man den Fehler auch HAT (z.B. an Modulübergängen), denn natürlich braucht das mehr Rechenzeit =)

_________________

Referent für Softwaretechnik und Kommunikation
Studierendenvertretung der LMU

0 Antworten mit Zitat
Bernhard Frauendienst
Admin
Admin
Bernhard Frauendienst

Beiträge: 5796
Karma: +254

Private Nachricht senden
E-Mail senden

Beitrag Verfasst am: So 19.10.08, 17:37       Titel: Re: Lösungsansatz: NoClassDefFoundError Nach oben

Ok, da muss ich ja jetzt schon mal ein paar Worte dazu verlieren.

Thomas K. Ramsauer hat Folgendes geschrieben:
Die Fehlermeldung wird erzeugt, wenn irgendwo im Code eine Klasse referenziert wird, die es nicht mehr gibt. Also die es zur Compilezeit noch gab, und zur Laufzeit nicht mehr. Java prüft beim konstruieren einer Klasse aber genau diese Referenzen durch, somit wird der "Horrorfehler" immer beim Konstruieren ausgeworfen.

Das hat jetzt nicht unbedingt mit "prüfen" zu tun, die VM muss eben wissen, welchen Code sie verlinken muss. Ist also ausnahmsweise mal keine Java-Schikane, sondern Notwendigkeit.

Thomas hat Folgendes geschrieben:
Wenn viele Leute an Code arbeiten, kann genau das öfter vorkommen.

Nein, kann es nicht, aus ganz einfachen Gründen: erstens checkt man in ein Repository nur laufenden, halbwegs getesteten Code ein, zweitens checkt man keinen Bytecode ein (weil redundant, binary, unpraktisch, etc.), und wenn wirklich jetzt noch jemand eine Möglichkeit findet, wie dieser Fehler auftreten kann, dann muss man sich eben noch angewöhnen, nach einem working copy update das Projekt zu rebuilden ("wenn hier jemand unnötige Anglizismen verwendet, dann bin ich das" ;)).

Reflection zu missbrauchen, um schlechte Programmier-Gewohnheiten auszubügeln halte ich für äußerst fragwürdig, und ich kann jedem nur abraten, sowas hier im Praktikum zu verwenden (vor allem meinen Teams :P).

Zu guter Letzt muss ich noch sagen, dass mir selbst dieses Problem ehrlich gesagt nie untergekommen ist, und ich kenne auch sonst niemand, der daran verzweifelt wäre.

0 Antworten mit Zitat
sweiza87
Prototype
Prototype


Beiträge: 66
Karma: 0

Private Nachricht senden
 

Beitrag Verfasst am: Mo 19.01.09, 12:45       Titel: Nach oben

pwn3d

0 Antworten mit Zitat
Foren-Übersicht / Softwareentwicklungspraktikum (WS0809)

Alle Zeiten sind GMT + 1 Stunde
Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.


die-informatiker.net
Das Forum der Informatik an der LMU (Uni München)
Ein Projekt des LMU Alumni Informatik e.V.
News
News Archiv
Sa 20.03.2010

Chidley Group Live im Schabernack

alle Termine
Foren Info
Wichtige Links:
• Algebra I
• Informatik I
• Analysis I
• Informatik III
• Analysis II
• Programmierpraktikum
• Lineare Algebra I
• Analysis II
• Analysis II Übungen
• Bioinformatik-Portal
• Digitale Medien
• Diskrete Strukturen :: Übungsblätter
• Diskrete Strukturen
• Informatik II
• Informatik I



Impressum
© 2007 die-informatiker.net
Powered by phpBB 2.0.23 © 2001, 2002 phpBB Group
Deutsche Übersetzung von phpBB.de und die-informatiker.net.