2016-12-14 56 views
1

我有這個類:的Java:靜態塊結果靜態最後絃樂人口的NoClassDefFoundError

public final class Validator { 

    private static final String TEST_VALUE = "test"; 
    private static final String TEST; 

    static { 
     TEST = TEST_VALUE + "_test"; 
    } 

    private Validator() {} 

    public static void validate() { 
     //Do something with TEST 
    } 
} 

當我打電話Validator.validate()從別的地方,我得到一個java.lang.NoClassDefFoundError: Could not initialize ....Validator

當我從Static block in Java not executed理解,最終靜態字符串在編譯時被預填充。

如果變量只在靜態塊中定義,是這種情況嗎?我希望編譯器不會嘗試預先填充最終變量。

如果不是這種情況......可能是什麼錯誤?

與調試器我注意到,永遠不會執行靜態塊,但我不知道爲什麼......

這就是Java 8 BTW。

UPDATE:

的問題是在靜態塊一個java錯誤。 奇怪的是,日誌中沒有指向靜態塊的任何錯誤,調試器也沒有在靜態構造函數中停止,所以我認爲這個問題在其他地方說謊。

+0

你能提供[MVCE](http://stackoverflow.com/help/mcve)嗎?無法重現您的問題,並從其他類調用Validator.validate()對我來說工作得很好。 –

+0

你是對的,當我用上面的代碼做一個獨立的例子,問題不會發生,我會做一些研究並在幾分鐘內更新問題 –

回答

0
static { 
    TEST = TEST_VALUE + "_test"; 
} 

可能不是您的真實代碼,因爲它不應該導致任何運行時異常。
你上升一個java.lang.NoClassDefFoundError,因爲有可能你遇到異常靜態集團:

static { 
     TEST = TEST_VALUE + "_test"; 
     } 

防止類加載。

您應該檢查您是否適當地記錄了至少在程序的標準輸出中可能出現的任何異常。

+1

你是對的。奇怪的是,日誌中沒有任何東西(這可能是由於spring框架)。使用調試器,它永遠不會進入靜態塊...但是我縮小了靜態構造函數中的代碼以找到錯誤 –

+0

的確,通過逐步隔離,您應該可以找到。如果您無法找到原因,請不要猶豫,以更詳細的方式編輯您的問題。 – davidxxx

+0

問題是一個.split函數帶有一個在靜態構造函數中被錯誤引用的點... –