我遇到了非常奇怪的 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)
// ... //
此代码通常可以毫无问题地工作,并且已经投入生产一年多。
这可能是Java错误吗?
/ *更新* /
destroy() 调用不会修改 stateStack。如果是这样,我猜 Java 会抛出 ConcurrentModificationException。
stateStack 填充了 1 个状态,它覆盖了销毁,但只进行本地修改。超级实现比打印额外的日志(“Destroying state ...”),它不在日志文件中,所以我猜在迭代开始时抛出了异常。
public void destroy()
{
destroyed = true;
LogFactory.getLog(State.class.getName()).info( "Destorying state : "+getClass().getName());
propertyChangeSupport.firePropertyChange(PROP_DESTROYED, null, this);
}