2016-12-14 2 views
1

の静的ブロックの結果でのstatic final String型の人口が、私はこのクラスを持っている:の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()を呼び出すと、私はStatic block in Java not executedから理解では、私はjava.lang.NoClassDefFoundError: Could not initialize ....Validator

を取得し、最終的静的な文字列はコンパイル時にあらかじめ用意されています。

変数がスタティックブロックでのみ定義されている場合、これが当てはまりますか?私は、コンパイラがその最終変数をあらかじめ設定しようとはしないことを期待しています。

そうでない場合はどうすればいいですか?デバッガで

私は、静的なブロックが実行されることはありませんことに気づいた、しかし...

これはところでJavaの8である理由私は得ることはありません。

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

あなたは正しいです。奇妙なことは、ログには何もないことです(これは、春のフレームワークによる可能性があります)。デバッガでは決して静的ブロックには入りません...しかし、エラーを見つけるために静的コンストラクタのコードを絞り込んでいます –

+0

実際には、ステップバイステップで隔離することで見つけることができます。あなたが原因を見つけることができない場合は、あなたの質問をもっと詳しく編集することをためらってください。 – davidxxx

+0

問題は.split関数で、静的なコンストラクタで間違って引用されたドットが... –

関連する問題