3

我正在尝试编写一个 IM 软件,我想让用户离开对话并告诉他的伙伴他已经离开了......我更喜欢使用 for 循环而不是 Iterator,寻找所有用户并让要求离开的用户和删除他...像这样:

   for(Clientuser Cu: EIQserver.OnlineusersList)
          if(Cu.ID.equals(thsisUser.ID)) // find the user who ask to leave 
          {
          Omsg.setBody("@@!&$$$$@@@####$$$$"); //code means : clien! ur parter leaves...
                 sendMessage(Omsg); // sed message to thje partner with that code
                 EIQserver.OnlineusersList.remove(Cu);// remove the partner
                EIQserver.COUNTER--;// decrease counter.

          }

我得到异常:java.util.ConcurrentModificationException

我正在使用迭代器,为了摆脱这个异常,我转换为 for,但仍然出现相同的异常!!我怎样才能摆脱这个异常?

4

5 回答 5

5

使用迭代器而不是循环。例如:

Iterator<Clientuser> iterator = EIQserver.OnlineusersList.iterator();
while (iterator.hasNext()) {
    Clientuser next = iterator.next();
    if(next.ID.equals(thsisUser.ID)) {
        Omsg.setBody("@@!&$$$$@@@####$$$$"); 
        sendMessage(Omsg); 
        iterator.remove();// remove the partner
    }
}
于 2013-10-31T09:24:33.060 回答
3

故障线路: EIQserver.OnlineusersList.remove(Cu);

您只能从正在通过Iterator您用于迭代的对象进行迭代的集合中删除元素。

for (Iterator<Clientuser> it = EIQserver.OnlineusersList.iterator(); it.hasNext();)
{
    Clientuser cu = it.next();
    if (!cu.ID.equals(thsisUser.ID))
        continue;
    // other code
    it.remove();
}
于 2013-10-31T09:20:58.917 回答
1

使用Iteratorfor 对循环中的列表进行操作:

Iterator<Clientuser> iter = EIQserver.OnlineuserList.iterator();
for(;iter.hasNext();) {
    Clientuser Cu = iterator.next();
    if(Cu.ID.equals(thsisUser.ID)) {
        Omsg.setBody("@@!&$$$$@@@####$$$$"); 
        sendMessage(Omsg); 
        iterator.remove(next);
    }
}
于 2013-10-31T09:27:31.953 回答
0

一种可能的解决方案是将 Collection 转换为 HashMap,保存要删除的 id,然后将其从 HashMap 中删除。

Collection<Integer> removeIds = new ArrayList<Integer>();
Map<Integer,ClientUser> all = new HashMap<Integer,ClientUser>();

for(Clientuser Cu: EIQserver.OnlineusersList) {
all.put(cu.ID,Cu);
      if(Cu.ID.equals(thsisUser.ID)) // find the user who ask to leave 
      {
      Omsg.setBody("@@!&$$$$@@@####$$$$"); //code means : clien! ur parter leaves...
             sendMessage(Omsg); // sed message to thje partner with that code
            EIQserver.COUNTER--;// decrease counter.
    removeIds.add(Cu.ID);

      }
}
于 2013-10-31T09:25:52.503 回答
-2

在迭代 EIQserver 集合类时,不能从同一类中删除元素。对迭代使用不同的集合并从 EIQserver 类中删除元素。

 List temp = ListofEIQserverobject;
  for(Clientuser Cu: temp.OnlineusersList){
    ..... your code then 
      EIQserver.OnlineusersList.remove(Cu);
    }
于 2013-10-31T09:22:26.673 回答