Java 迭代器中的ConcurrentModificationException.next()我找不到其他解决方案

Java 迭代器中的ConcurrentModificationException.next()我找不到其他解决方案,java,exception,concurrentmodification,Java,Exception,Concurrentmodification,我目前正在编写一个小小的网络代码,希望cicle抛出我所有的播放器,所以我使用了ArrayLists和list,但是有很多异常,所以深入到问题中,我用迭代器替换了它们,但是我在所有的“it.next()”:/中都遇到了并发修改异常。 所以如果你能帮我理解这个问题:) @覆盖 公开募捐 { StringBuilder l=新的StringBuilder(); 迭代器; 迭代器pa; while(Jelly.isSTATUS()){ pc=Jelly.getOnlinePlayer().keySet

我目前正在编写一个小小的网络代码,希望cicle抛出我所有的播放器,所以我使用了ArrayLists和list,但是有很多异常,所以深入到问题中,我用迭代器替换了它们,但是我在所有的“it.next()”:/中都遇到了并发修改异常。 所以如果你能帮我理解这个问题:)

@覆盖
公开募捐
{
StringBuilder l=新的StringBuilder();
迭代器;
迭代器pa;
while(Jelly.isSTATUS()){
pc=Jelly.getOnlinePlayer().keySet().iterator();
while(pc.hasNext())
试一试{
System.out.println(“已输入!”);
Player p=Jelly.getOnlinePlayer().get(pc.next());
System.out.println(p.getIGN());
if(Packetsts.containsKey(p)和&!Packetsts.get(p).isEmpty())
试一试{
pa=Packetsts.get(p.iterator();
while(pa.hasNext()){
包i=pa.next();
for(字符串j:i.getData())
l、 附加(j+“,”);
l、 附加(“es”);
System.out.println(“数据:+l.toString());
字节[]toSendBytes=l.toString().getBytes();
int-toSendLen=toSendBytes.length;
字节[]toSendLenBytes=新字节[4];
toSendLenBytes[0]=(字节)(toSendLen&0xff);
toSendLenBytes[1]=(字节)(toSendLen>>8&0xff);
toSendLenBytes[2]=(字节)(toSendLen>>16&0xff);
toSendLenBytes[3]=(字节)(toSendLen>>24&0xff);
PrintStreams.get(p).write(toSendLenBytes);
PrintStreams.get(p).write(toSendBytes);
包装。获取(p)。移除(i);
l、 设定长度(0);
}
}捕获(例外情况除外){}
}catch(ConcurrentModificationException ex){ex.printStackTrace();}
}
System.out.println(“结束!”);
}
谢谢:)

更新:

    @Override
public void run()
{
    StringBuilder l = new StringBuilder();
    Iterator<UUID> pc = Jelly.getOnlinePlayers().keySet().iterator();
    Iterator<Packet> pa;
    while (Jelly.isSTATUS())
        if (!Jelly.getOnlinePlayers().keySet().isEmpty()) {
            pc = Jelly.getOnlinePlayers().keySet().iterator();
            while (pc.hasNext()) {
                UUID u = pc.next();
                Player p = Jelly.getOnlinePlayers().get(u);
                if (Packetsts.containsKey(p) && !Packetsts.get(p).isEmpty())
                    try {
                        pa = Packetsts.get(p).iterator();
                        while(pa.hasNext()) {
                            Packet i = pa.next();
                            for ( String j : i.getData())
                                l.append(j + ",");
                            l.append("es");

                            System.out.println("Data: " + l.toString());
                            byte[] toSendBytes = l.toString().getBytes();
                            int toSendLen = toSendBytes.length;
                            byte[] toSendLenBytes = new byte[4];
                            toSendLenBytes[0] = (byte)(toSendLen & 0xff);
                            toSendLenBytes[1] = (byte)(toSendLen >> 8 & 0xff);
                            toSendLenBytes[2] = (byte)(toSendLen >> 16 & 0xff);
                            toSendLenBytes[3] = (byte)(toSendLen >> 24 & 0xff);
                            PrintStreams.get(p).write(toSendLenBytes);
                            PrintStreams.get(p).write(toSendBytes);

                            l = new StringBuilder();
                        }
                        Packetsts.get(p).clear();
                    } catch ( Exception ex) { ex.printStackTrace(); }
            }
        }
    System.out.println("END!");
}
@覆盖
公开募捐
{
StringBuilder l=新的StringBuilder();
迭代器pc=Jelly.GetOnlinePlayer().keySet().Iterator();
迭代器pa;
while(Jelly.isSTATUS())
如果(!Jelly.GetOnlinePlayer().keySet().isEmpty()){
pc=Jelly.getOnlinePlayer().keySet().iterator();
while(pc.hasNext()){
UUID u=pc.next();
Player p=Jelly.getOnlinePlayer().get(u);
if(Packetsts.containsKey(p)和&!Packetsts.get(p).isEmpty())
试一试{
pa=Packetsts.get(p.iterator();
while(pa.hasNext()){
包i=pa.next();
for(字符串j:i.getData())
l、 附加(j+“,”);
l、 附加(“es”);
System.out.println(“数据:+l.toString());
字节[]toSendBytes=l.toString().getBytes();
int-toSendLen=toSendBytes.length;
字节[]toSendLenBytes=新字节[4];
toSendLenBytes[0]=(字节)(toSendLen&0xff);
toSendLenBytes[1]=(字节)(toSendLen>>8&0xff);
toSendLenBytes[2]=(字节)(toSendLen>>16&0xff);
toSendLenBytes[3]=(字节)(toSendLen>>24&0xff);
PrintStreams.get(p).write(toSendLenBytes);
PrintStreams.get(p).write(toSendBytes);
l=新的StringBuilder();
}
Packetsts.get(p.clear();
}catch(异常ex){ex.printStackTrace();}
}
}
System.out.println(“结束!”);
}
行“UUID u=pc.next();”拜托,我真的很讨厌并发修改异常:/

这是不允许的

Packetsts.get(p).remove(i);

当您同时迭代要修改的ArrayList时。循环开始时复制一份怎么样?删除元素后的最终目标是什么?

如果要在遍历某个集合时修改该集合,则必须通过调用迭代器的一个方法来完成修改。所以问题是Packetsts.get(p)和remove(i)。必须通过调用iterator.remove()来完成删除。您的最终目标是什么?删除所有数据包后?另外,请停止捕获ConcurrentModificationException和Exception。不应抓住这些例外情况。尤其是如果你忽视了他们,那么。我应该用“pa.remove()”替换它吗?让我猜猜,错误出现在Packetsts.get(p.clear());所以我是否应该将其替换为“pa.remove()”?嗯,不应该。最好在列表的开头创建一个新列表loop@CavariuX对我来说,
pa.remove()
听起来很合理,但迭代器不一定要实现该方法,可能会抛出一个不支持的操作异常,我设法修复了它,但现在错误又出现了另一行:/Check update please更多地说明为什么要删除这些元素会有所帮助。我仍然建议创建一个新的列表。删除所有元素后,是否需要返回列表?
Packetsts.get(p).remove(i);