Java の非常に奇妙な動作に遭遇しました。これがバグなのか、それとも何か不足しているのかわかりません。
このコードは、stateStack (LinkedList) リストを調べて、すべての状態を破棄するだけです。
public void clearStates()
{
LogFactory.getLog(StateController.class.getName())
.info( "Clearing states. #ofstates="+stateStack.size());
for (State state : stateStack) // Line 132 (see exception)
{
state.destroy();
}
// ...
}
次の例外が発生しました。
INFO controllers.StateController : Clearing states. #ofstates=1
java.lang.NullPointerException\
at java.util.LinkedList$ListItr.next(LinkedList.java:891)
at *.controllers.StateController.clearStates(StateController.java:132)
// ... //
このコードは通常問題なく動作し、1 年以上にわたって運用されています。
これはJavaのバグである可能性はありますか?
/ * 更新 * /
destroy() 呼び出しは、stateStack を変更しません。もしそうなら、JavaはConcurrentModificationExceptionをスローすると思います。
stateStack には、destroy をオーバーライドする 1 つの状態が取り込まれましたが、ローカルの変更のみが行われます。ログファイルになかった追加のログ(「Destroying state ...」)を出力するよりもスーパー実装なので、反復の最初に例外がスローされたと思います。
public void destroy()
{
destroyed = true;
LogFactory.getLog(State.class.getName()).info( "Destorying state : "+getClass().getName());
propertyChangeSupport.firePropertyChange(PROP_DESTROYED, null, this);
}