的Java:静态块结果静态最后弦乐人口的NoClassDefFoundError

问题描述:

我有这个类:的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

你是对的,当我用上面的代码做一个独立的例子,问题不会发生,我会做一些研究并在几分钟内更新问题 –

static { 
    TEST = TEST_VALUE + "_test"; 
} 

可能不是您的真实代码,因为它不应该导致任何运行时异常。
你上升一个java.lang.NoClassDefFoundError,因为有可能你遇到异常静态集团:

static { 
     TEST = TEST_VALUE + "_test"; 
     } 

防止类加载。

您应该检查您是否适当地记录了至少在程序的标准输出中可能出现的任何异常。

+1

你是对的。奇怪的是,日志中没有任何东西(这可能是由于spring框架)。使用调试器,它永远不会进入静态块...但是我缩小了静态构造函数中的代码以找到错误 –

+0

的确,通过逐步隔离,您应该可以找到。如果您无法找到原因,请不要犹豫,以更详细的方式编辑您的问题。 – davidxxx

+0

问题是一个.split函数带有一个在静态构造函数中被错误引用的点... –