我遇到了非常奇怪的Java行爲,我不知道它是否是一個bug,或者我錯過了一些東西 。LinkedList中的空指針異常在使用for-each循環時
代碼只是通過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();
}
// ...
}
以下異常被trowed:
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個狀態,這會覆蓋銷燬,但僅對 進行局部修改。超級實現打印另外的日誌(「銷燬狀態...」),這不在日誌文件中,所以我猜這個異常是在迭代開始時拋出的 。
public void destroy()
{
destroyed = true;
LogFactory.getLog(State.class.getName()).info("Destorying state : "+getClass().getName());
propertyChangeSupport.firePropertyChange(PROP_DESTROYED, null, this);
}
line':132'在哪裏?也許你的列表中的'state'是'null'? – Manuel
如何以及在哪裏獲得stateStack? – arjacsoh
'state.destroy()'的實現是什麼?它有什麼作用?另外,'stateStack'如何填充? – mthmulders