Wie die analyse eines NoClassDefFoundError verursacht durch einen ignoriert ExceptionInInitializerError?

Heute verbrachte ich meinen Nachmittag mit der Analyse einer NoClassDefFoundError. Nach überprüfung der classpath wieder und wieder, es stellte sich heraus, dass es ein statisches Mitglied einer Klasse, die warf eine Ausnahme, wurde nicht das erste mal. Nach, dass jede Verwendung der Klasse werfen NoClassDefFoundError ohne einen aussagekräftigen stacktrace:

Exception in thread "main" java.lang.NoClassDefFoundError: 
    Could not initialize class InitializationProblem$A
    at InitializationProblem.main(InitializationProblem.java:19)

Das ist alles. Keine weiteren Zeilen mehr.

Reduziert bis zu dem Punkt, das war das problem:

public class InitializationProblem {
    public static class A {
        static int foo = 1 / 0;
        static String getId() {
            return "42";
        }
    }

    public static void main( String[] args ) {
        try {
            new A();
        }
        catch( Error e ) {
            //ignore the initialization error
        }

        //here an Error is being thrown again,
        //without any hint what is going wrong.
        A.getId();
    }
}

Damit es nicht ganz so einfach, alle, aber die letzten call of A.getId() war irgendwo versteckt in der Initialisierungs-code, der ein sehr großes Projekt.

Frage:

Jetzt, dass ich gefunden habe, dieser Fehler nach Stunden von Versuch und Irrtum, ich Frage mich, ob es ein straight forward Weg zu finden, diese Fehler ab der ausgelösten Ausnahme. Irgendwelche Ideen auf, wie dies zu tun?


Ich hoffe, diese Frage wird ein Hinweis für alle anderen die Auswertung einer unerklärlichen NoClassDefFoundError.

  • Meine erste Idee wäre nicht zu fangen und zu ignorieren Errors. Je.
  • Dies war eine Initialisierung einige test-Klassen gesammelt aus dem Dateisystem. Ich versuchte jede Klasse instanziieren, um zu sehen, ob Sie mit einer gegebenen Oberfläche... Manche Klassen können nicht instanziiert werden, wie z.B. die abstrakten. Also habe ich alle Fehler abgefangen und ignoriert Sie.
  • Zumindest, drucken Sie die stack-trace. Ein leerer catch-block sollte eine rote Flagge, um Sie. (Haben Sie jemals verwendet FindBugs? Es wird helfen, fangen viele Dinge viel früher, als würden Sie auf Ihre eigenen.)
  • Sie brauchen nicht zu instanziieren einer Klasse, um zu sehen, ob es eine Schnittstelle implementiert. Um zu sehen, ob ein Class<?> someUnknownClass implementiert einige interface IInterface tun IInterface.class.isAssignableFrom(someUnknownClass)
  • Eigentlich hatte ich eine Klasse.forName(), und auch dies den Fehler verursacht. Jetzt bin ich auf der Suche nach einem besseren Weg, siehe stackoverflow.com/questions/2210930/...
  • die Antwort ist in Ihrem eigenen Kommentar. Ignorieren Sie nicht die Ausnahmen überprüfen, ob die Klasse Abstrakt oder nicht

InformationsquelleAutor tangens | 2010-02-05
Schreibe einen Kommentar