【问题标题】:Stuck with "java.util.ConcurrentModificationException"卡住“java.util.ConcurrentModificationException”
【发布时间】:2011-08-04 11:41:50
【问题描述】:

这是我的代码:

// eventList is a LinkedList

public void run() {

    Iterator<Event> it = eventList.iterator();
    int size = eventList.size();

    while(size > 0) {
        while(it.hasNext()) {
            Event e = it.next(); //flaged line

            if(e.ready()) {
                System.out.println(e);
                e.action();
                eventList.remove(e);
                --size;
            }
        }
    }
}

错误java.util.ConcurrentModificationException 被抛出在标志线 (Event e = it.next();) 上。您是否在我的代码中看到一个错误,该错误使引发该异常的原因显而易见?

【问题讨论】:

标签: java exception linked-list concurrentmodification


【解决方案1】:

您正在修改eventList,同时使用eventList.remove(),同时迭代它。您不能这样做,否则Iterator 将无法使用。

只需将eventList.remove(e) 替换为it.remove() 就可以了。

此外,如果您的某个事件在第一次运行时未准备好,您很容易陷入无限循环,因为一旦返回 trueit.hasNext() 将永远不会返回 true,但 size 不会也可以修改。一种解决方案是将整个Iterator it = ...移入第一个while 循环。

我还将修改外部while 循环以使用while (!e.isEmpty()),而不是尝试手动跟踪eventList 的大小。

【讨论】:

【解决方案2】:

你应该通过迭代器移除元素,否则迭代器会因为底层集合改变而被重置。

【讨论】:

    猜你喜欢
    • 2013-02-26
    • 2017-12-29
    • 2011-11-17
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多