2012-06-18 8 views
7

JMMによれば起こらないような奇妙な動作が見られます。 私は、クラスAを継承したクラスBを持っています。これは、コンストラクタ内のクラスBによってアクセスされるコンストラクタで初期化される、Aの最終的な保護フィールドです。サブクラスからアクセスしたときのファイナルフィールドの状態

しかし、ごくまれに、BでアクセスするとNPEが得られます。 アイデアはありますか?コードの

パート:

class AsyncReplicationSourceGroup extends AbstractReplicationSourceGroup{ 

    public AsyncReplicationSourceGroup(DynamicSourceGroupConfigHolder groupConfig){ 
     super(groupConfig); 
     createReplicationChannels(); 
    } 

    protected void createReplicationChannels(){ 
     //... 
     specificLogger.finest("created channel"); // this is where the NPE is thrown from 
     //... 
    } 
} 

abstract class AbstractReplicationSourceGroup{ 

    protected final Logger specificLogger; 

    public AbstractReplicationSourceGroup(DynamicSourceGroupConfigHolder groupConfigHolder){ 
     specificLogger = Logger.getLogger(Constants.LOGGER_REPLICATION_GROUP + "." + _groupConfigHolder.getConfig().getName()); 
     //... 
    } 

} 
+10

最小限の失敗例を投稿できますか?そうでなければ、我々は推測している。 –

+0

コードはどのようなものですか? – plucury

+1

例外を再現する例を教えてください。 – sp00m

答えて

1

それは一人で掲示コードから確実に伝えることは不可能ですが、あなたは、ロガー自体がnullであることが確実な場合には、(あなたが誤っNPEが表示されません内部から言うと、specificLogger.finest)、Logger.getLoggerは何らかの理由でnullを返すことがあります。

コンストラクタ内で参照がリークしない限り、コンストラクタに割り当てられた最終フィールドが可視になると、問題がスレッド化されるとは思われません。

0

あなたの例では分かりませんが、私のgueseは、ロギングフレームワークと電車の邪魔をしてコンストラクタで初期化する必要があります。これはロガー宣言が常にであるべき理由の1つです。プライベート静的最終

関連する問題