2017-02-04 8 views
1

私は、プライベート静的プロパティオブジェクトを設定して、ファクトリクラスのコンストラクタの自分のファクトリクラスの一部の設定でロードします。プライベート静的プロパティ変数によってNULLポインタ例外が発生する

ただし、クラスを初期化すると、NullPointerExceptionがスローされます。

java.lang.NullPointerException 
    at factory.BussinessServiceFactory.<init>(BussinessServiceFactory.java:15) 
    at factory.BussinessServiceFactory.<clinit>(BussinessServiceFactory.java:8) 
    ... 24 more 

次に、プロパティオブジェクトを非静的オブジェクトに変更すると、問題は解決されます。しかし、私はまだこれが起こる理由と、それがどのようにこのように解決できるのかという理由で、混乱しています。

+0

例外として、* testFindOrder *に問題があり、* testPageQuery *が表示されています。私たちはどのようにあなたを助けますか? – CKing

答えて

1

スタティックイニシャライザがトップダウンされます。静的フィールドfactoryは、クラスBussinessServiceFactoryが読み込まれると初期化されます。この静的初期化子はBussinessServiceFactoryのコンストラクタを呼び出し、最終的に静的フィールドbsConfigへの参照をロードします。このフィールドはまだfactoryフィールドの静的イニシャライザブロックにあるため、この時点ではまだ初期化されていません。したがって、NullPointerException。これは、1)まだfactoryフィールドの上にあることをbsConfigフィールドを並べ替え、またはそれ以上のいずれか

修正は、あなたがそれを修正するために何をしたかである(bsConfigフィールドにインスタンスフィールドを作ることによって、このフィールド間の依存関係を持っていないと私はこのような問題を解決する最善の方法だと信じています)。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.4を参照してください。静的初期化の順序については、

補足: stacktraceは、問題の原因を明らかにします。スタックトレース内のclinitcl ass initの略であり、問​​題がクラスの読み込みであることがわかります。

+0

ありがとう、あなたの答えは非常に有用です! –

関連する問題