3

私は IM ソフトウェアをプログラムしようとしています。ユーザーが会話から離れて、彼が去ったことをパートナーに伝えたいです...私はイテレーターの代わりに for ループを使用することを好み、すべてのユーザーを探して、退出を要求するユーザーを取得し、彼を削除します...そのように:

   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を使用します。例えば:

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 に答える