3

I am trying to program an IM software, I want to let user leave the conversation and tell his partner that he has left... I prefer to use for loop instead Iterator, seek all the users and get the user who ask to leave and remove him... like that:

   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.

          }

I get Exception: java.util.ConcurrentModificationException

I was using iterators, and to get rid of this exception, I convert to for, but the same exception still appears!! how may I get rid of this exception?

EsmaeelQash
  • 488
  • 2
  • 6
  • 20
  • 3
    You cannot remove something from a list which you are looping through. – Trick Oct 31 '13 at 09:20
  • 1
    @Trick unless you remove it using the same iterator you are using on the loop or you are using a collection that supports it, like CopyOnWriteArrayList. – aalku Oct 31 '13 at 09:24
  • You should definitely read this (not an answer): http://www.oracle.com/technetwork/java/codeconventions-135099.html#367 – aalku Oct 31 '13 at 09:28
  • True. By the way @EsmaeelQash, try to follow Java Coding Standards (Naming Conventions). If you will ever pass your code, it create a pain for your follower :) – Trick Oct 31 '13 at 09:28
  • I'll edited the question to follow naming conventions... – aalku Oct 31 '13 at 09:29
  • No need to do that now :) Just have in mind for your future endeavors. – Trick Oct 31 '13 at 09:55

5 Answers5

7

Use Iterator instead of looping. For example:

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
    }
}
Konstantin Yovkov
  • 62,134
  • 8
  • 100
  • 147
3

Faulting line: EIQserver.OnlineusersList.remove(Cu);

You can only remove elements from a collection that is being iterated over via the Iterator object you are using to iterate.

for (Iterator<Clientuser> it = EIQserver.OnlineusersList.iterator(); it.hasNext();)
{
    Clientuser cu = it.next();
    if (!cu.ID.equals(thsisUser.ID))
        continue;
    // other code
    it.remove();
}
Tadas S
  • 1,955
  • 19
  • 33
1

Use Iterator for do something with list in loop:

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);
    }
}
SeniorJD
  • 6,946
  • 4
  • 36
  • 53
0

One possible solution is also to transform the Collection to HashMap, save id's to remove and then remove it from the 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);

      }
}
Trick
  • 3,779
  • 12
  • 49
  • 76
-2

As you are Iterating the EIQserver collection class, you can not remove element from the same class. Use a different collection for Iteration and remove the element from EIQserver class.

 List temp = ListofEIQserverobject;
  for(Clientuser Cu: temp.OnlineusersList){
    ..... your code then 
      EIQserver.OnlineusersList.remove(Cu);
    }
Debabrata
  • 5
  • 2