使用for-each循环时LinkedList中的Nullpointer异常
我遇到了非常奇怪的Java行为,但我不知道这是一个bug,还是我错过了一些东西。
该代码只需遍历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=1java.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个状态,该状态将覆盖destroy,但仅进行本地修改。然后,超级实现将打印不在日志文件中的其他日志(“销毁状态…”),因此我猜想该异常是在迭代开始时抛出的。
public void destroy(){
destroyed = true;
LogFactory.getLog(State.class.getName()).info( "Destorying state : "+getClass().getName());
propertyChangeSupport.firePropertyChange(PROP_DESTROYED, null, this);
}
回答:
下面的代码几乎每次运行它都会生成相同的异常-
想法是在从另一个线程迭代时修改列表。由于幸运的时机,修改发生在该方法之后checkForComodification
但之前,从而导致NPE。next
= next.next;``ListItr#next
java.util.LinkedList $ ListItr.next(LinkedList.java:891)处的线程“
main”中的java.lang.NullPointerException,javaapplication4.Test1.main(Test1.java:74)处的异常
public class Test { public static void main(String[] args) {
final int SIZE = 100000;
final Random rand = new Random();
final List<Integer> list = new LinkedList<>();
for (int i = 0; i < SIZE; i++) {
list.add(i);
}
Runnable remove = new Runnable() {
@Override
public void run() {
while (true) {
int i = rand.nextInt(SIZE);
list.remove(i);
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
break;
}
list.add(i);
}
}
};
Thread t = new Thread(remove);
t.start();
for (int i = 0; i < 100; i++) {
try {
for (Integer j: list) {
///whatever
}
} catch (ConcurrentModificationException e) {
} catch (NullPointerException e) {
e.printStackTrace();
}
}
t.interrupt();
}
}
以上是 使用for-each循环时LinkedList中的Nullpointer异常 的全部内容, 来源链接: utcz.com/qa/399177.html