我正在尝试编写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,但同样的异常仍然出现!! 我怎么能摆脱这个例外?
答案 0 :(得分: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();
}
答案 1 :(得分:3)
使用Iterator代替循环。例如:
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
}
}
答案 2 :(得分:1)
使用Iterator
执行list in循环:
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);
}
}
答案 3 :(得分: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);
}
}
答案 4 :(得分:-2)
在迭代EIQserver集合类时,不能从同一个类中删除元素。使用不同的集合进行迭代,并从EIQserver类中删除该元素。
List temp = ListofEIQserverobject;
for(Clientuser Cu: temp.OnlineusersList){
..... your code then
EIQserver.OnlineusersList.remove(Cu);
}