gpt4 book ai didi

java - 使用 for-each 循环时 LinkedList 中的空指针异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:10:15 28 4
gpt4 key购买 nike

我遇到了非常奇怪的 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 个状态,它覆盖了 destroy,但只局部修改。 super 实现比打印额外的日志(“Destroying state ...”)不在日志文件中,所以我猜异常被抛出迭代的开始。

public void destroy()
{
destroyed = true;
LogFactory.getLog(State.class.getName()).info( "Destorying state : "+getClass().getName());
propertyChangeSupport.firePropertyChange(PROP_DESTROYED, null, this);
}

最佳答案

下面的这段代码几乎每次运行时都会产生相同的异常——其想法是在从另一个线程迭代时修改列表。在(不)幸运的时机下,修改发生在 checkForComodification 之后但在 ListItr#next 方法中的 next = next.next; 之前,导致一个 NPE。

Exception in thread "main" java.lang.NullPointerException at java.util.LinkedList$ListItr.next(LinkedList.java:891) at 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();
}
}

关于java - 使用 for-each 循环时 LinkedList 中的空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18055024/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com