|
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 =)
|