2011-04-13 47 views
6

这里是我的代码:与 “java.util.ConcurrentModificationException” 卡壳

// 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();)被抛出。你是否看到我的代码中有一个错误,使得该异常被抛出的原因显而易见?

+0

可能重复的[删除列表上的循环](http://stackoverflow.com/questions/1921104/loop-on-list-with-remove) – McDowell 2011-05-09 12:09:15

回答

17

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

只需将eventList.remove(e)替换为it.remove()即可,应该没问题。

此外,您还可以轻松地运行到一个无限循环,如果你的一个事件是不是准备在第一次运行,因为it.hasNext()不会返回true一旦返回false,但size将不能修改。一种解决方案是将整个Iterator it = ...内部的第一个while循环。

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

+0

+1这个答案;只是一个说明,这个问题描述在该例外的文档中: http://download.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html – 2011-04-13 07:35:27

+0

谢谢。我认为问题在于我在代码上花费了很多时间:)谢谢。 – artaxerxe 2011-04-13 07:37:11

1

您应该通过迭代器移除元素,否则迭代器会因为底层集合发生变化而重置。