2016-05-11 178 views
0

我有一種情況,我得到一個NoClassDefFoundError。由於沒有太多的資料,我100%肯定,類是存在的,我做了Eclipse調試器的一些詳細的測試:非常奇怪NoClassDefFoundError

  1. 啓動Java程序在調試模式下
  2. 當它停(地方) ,我檢查正在運行的線程的類路徑(在調試模式下)。 「missing」類的目錄就在那裏,而.class文件也在那裏。
  3. 在表達式窗口,我想補充兩個表達式:

    一)新MyClass的() - >導致的NoClassDefFoundError

    二)MyClass.class - >顯示類定義!?!?

  4. 我把一個斷點放在MyClass構造函數的第一行,它永遠不會停在那裏,所以構造函數永遠不會被調用......調用類的私有靜態最終字段從調試窗口工作...

這怎麼可能?我還用VisualVM窺視了這個過程,我可以看到「MyClass」定義。課堂上有什麼會導致這樣的錯誤?

我不能得到這種情況的一個小複製的例子,因爲我不知道是什麼原因導致它。類的單元測試可以實例化它,這種行爲只發生在一個集成的上下文中。

+0

分享一些你得到這個錯誤的代碼。 – 11thdimension

+2

如果在初始化類時發生故障,通常當我們在靜態塊中出現異常時,可能會發生這種情況,請檢查所有靜態塊 –

+0

@NicolasFilotto,這正是原因......有一個調用Spring Bean一個靜態初始化器... – Martin

回答

1

如果在初始化class故障可能出現這種情況,通常當我們在static blocksexception所以你應該檢查所有的static blocks,以確保他們沒有拋出RuntimeException

+0

這個問題的煩人的部分是,靜態塊中異常的Stacktrace並不總是顯示...你只會看到NoClassDefFoundError ...這是一個令人沮喪的情況來分析... – Martin

+0

是的,我知道,它總是很難找到,這就是爲什麼我們需要最安全地保護我們執行的代碼的原因靜態塊 –

+0

...或者乾脆避免在靜態塊中訪問外部依賴... :) – Martin

2

我相信NoClassDefFoundError可能是由於聯繫問題。當你這樣做:

MyClass.class

您是裝載類,但不進行初始化;這意味着初始化中使用的引用不需要解析。在另一方面,當你創建一個實例:

new MyClass()

...確實需要初始化類,引用需要解決的問題,你可以得到在這一點上失敗 - 這的確是你做的。對我來說,這意味着這個類引用了另一個不能由於某種原因被加載的類,或者類的初始化失敗(儘管後者通常給出ExceptionInInitializerError)。

+0

是的,我懷疑類似的東西。但是如何找出缺失的東西呢? Eclipse在Workspace中沒有錯誤,項目構建得很好... – Martin

+1

@Martin捕獲錯誤「getCause()」,打印原因的堆棧跟蹤 - 也許。 :) 祝你好運。 – davmac