2010-12-13 75 views
4

上下文: java.io.File類有一個靜態的內部類方法如下:Java靜態內部類初始化錯誤

LazyInitialization.temporaryDirectory(); 

[編輯以添加更多的代碼] 我的下面的代碼最終調用上述代碼行。 temporaryDirectory()方法引發異常,這在我的上下文中是很好的/預期的。

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

然後,當我下一次調用相同的方法(createTempFile)再次,我得到一個 「java.lang.NoClassDefFound錯誤 - 無法初始化類java.io.File $惰性初始模式」

問題: 我認爲內部類LazyInitialization應該在其靜態方法被調用時由類加載器加載,即使內部方法拋出異常。但是,爲什麼在第二次調用時會看到NoClassDefFound錯誤?原來的假設是否不正確?

+0

我認爲它應該工作。告訴我們你的代碼。 – thejh 2010-12-13 22:00:59

回答

7

當一個靜態初始化代碼拋出一個運行時異常時,它被ExceptionInInitializerError包裝並拋出到觸發類加載的代碼的上下文中(如果它的Error異常,它沒有被包裝)。此時,班級加載失敗。因此,稍後嘗試使用它將導致NoClassDefFoundError。

也許這是你的經驗。

+0

是的,完全比埃伊爾 – 2010-12-13 22:31:39