我环顾四周,找不到任何匹配或修复我的问题。我正在尝试制作一个非常基本的服务器系统,它将进入更高级的东西。出于某种原因,如果多个客户端尝试加入,则会因此错误消息而崩溃。
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();
任何帮助都会受到极大的赞赏
谢谢,
〜瑞恩
答案 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();
}
}