2010-12-13 10 views
4

Kontext: java.io.File Klasse hat eine statische Methode innere Klasse wie folgt:java statische innere Klasse Initialisierung Fehler

LazyInitialization.temporaryDirectory(); 

[EDITED etwas mehr Code hinzufügen] unter Mein Code ruft schließlich die oben Codezeile. Eine Exception wird in der temporaryDirectory() -Methode ausgelöst, was in meinem Kontext gut/erwartet ist.

try { 
    File tempFile = File.createTempFile("aaa", "aaa"); 
} catch (Exception e) { 
    // handle exception 
} 

Dann, wenn ich rufe neben die gleiche Methode (createTempFile) wieder, erhalte ich einen "java.lang.NoClassDefFound Fehler - kann nicht Klasse java.io.File $ LazyInitialization initialisieren"

Frage: Ich nahm an, dass die innere Klasse LazyInitialization vom Klassenladeprogramm geladen worden sein sollte, wenn ihre statische Methode aufgerufen wurde, obwohl die innere Methode eine Ausnahme ausgelöst hat. Warum sehe ich den NoClassDefFound Fehler beim zweiten Aufruf? Ist die ursprüngliche Annahme falsch?

+0

Ich denke, dass es funktionieren sollte. Zeig uns deinen Code. – thejh

Antwort

7

Wenn ein statischer Initialisierungscode eine Laufzeitausnahmebedingung auslöst, wird sie von ExceptionInInitializerError umbrochen und im Kontext des Codes ausgelöst, der das Laden der Klasse auslöst (falls es eine Fehlerausnahme ist, wird sie nicht umgebrochen). Zu diesem Zeitpunkt ist das Laden der Klasse fehlgeschlagen. Daher wird jeder Versuch, es später zu verwenden, ein NoClassDefFoundError verursachen.

Vielleicht ist das, was Sie erleben.

+0

ja genau danke Eyal –