die-informatiker.net Logo   2513 registrierte Benutzer.
Insgesamt 96850 Beiträge.
Suche
• erweiterte Suche
Login
Benutzername:
Passwort:
• Registrieren

Ein Projekt des

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: 205

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
Studentischer Datenschutzbeauftragter
Studierendenvertretung der LMU

Antworten mit Zitat
Bernhard Frauendienst
Admin
Admin
Bernhard Frauendienst

Beiträge: 5863

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.

Antworten mit Zitat
sweiza87
Prototype
Prototype


Beiträge: 68

Private Nachricht senden
 

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

pwn3d

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
Mehr Privacy auf die-informatiker.net
Mo 26.07.10, 21:46

News Archiv
So 01.08.2010

#Event# Theatron Musik Sommer

Mo 02.08.2010

#Event# Theatron Musik Sommer

Di 03.08.2010

#Event# Theatron Musik Sommer

"Forum Lehre" - Bachelor/Masterverbesserung

Mi 04.08.2010

#Event# Theatron Musik Sommer

Do 05.08.2010

#Event# Theatron Musik Sommer

Fr 06.08.2010

#Event# Theatron Musik Sommer

Sa 07.08.2010

#Event# Theatron Musik Sommer

So 08.08.2010

#Event# Theatron Musik Sommer

Mo 09.08.2010

#Event# Theatron Musik Sommer

Di 10.08.2010

#Event# Theatron Musik Sommer

Mi 11.08.2010

#Event# Theatron Musik Sommer

Do 12.08.2010

#Event# Theatron Musik Sommer

Fr 13.08.2010

#Event# Theatron Musik Sommer

Sa 14.08.2010

#Event# Theatron Musik Sommer

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.