使用Iterator的java.util.ConcurrentModificationException

时间:2014-02-28 20:04:31

标签: java sockets concurrentmodification

我环顾四周,找不到任何匹配或修复我的问题。我正在尝试制作一个非常基本的服务器系统,它将进入更高级的东西。出于某种原因,如果多个客户端尝试加入,则会因此错误消息而崩溃。

Exception in thread "messageRecieveThread" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
at zx.server.threads.connections.Message.run(Message.java:23)
at java.lang.Thread.run(Thread.java:724)

到目前为止,这是我的留言课:

package zx.server.threads.connections;

import java.io.IOException;
import java.net.Socket;
import java.util.Iterator;

import zx.server.communication.handle.Processing;
import zx.server.storage.severSide.Store;

public class Message implements Runnable {
private Thread thread;

public Message() {
    thread = new Thread(this);
    thread.setName("messageRecieveThread");
    thread.start();
}

@Override
public void run() {
    while (true) {
        for (Iterator<Socket> it = Store.getAll().iterator(); it.hasNext();) {
            Socket s = it.next();
            try {
                if (s.getInputStream().available() != 0) {
                    byte[] buffer = new byte[s.getInputStream().available()];
                    s.getInputStream().read(buffer);
                    new Processing(s, buffer);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

}

可能导致错误的行是这一行:

Socket s = it.next();

任何帮助都会受到极大的赞赏 谢谢,
〜瑞恩

1 个答案:

答案 0 :(得分:2)

您的问题不在显示的代码上。你的问题出在你的班级商店。

说明: 发生的事情是,当您迭代Store.getAll()套接字时,另一个套接字正在从Store.getAll()检索的同一结构中插入或删除(很可能是java.util.Collection的子类 - 例如:LinkedList,ArrayList ,HashMap等。)。

原因: 在修改相同的集合时,您无法迭代Collection。 See ConcurrentModificationException javadocs

解: 无论如何,为了解决你所显示的代码片段上的问题,我建议你克隆Store.getAll()返回的结构。但请注意,此结构将在其内容上过时,因为在Store类中插入或删除了套接字。

提示:(这不会解决您的问题但会帮助您时尚地编程) 要迭代某些结构中的元素,请在Java中使用它:

for(Socket s : Store.getAll()) {
    try {
        if (s.getInputStream().available() != 0) {
            byte[] buffer = new byte[s.getInputStream().available()];
            s.getInputStream().read(buffer);
            new Processing(s, buffer);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}