2015-11-02 88 views
-1

我目前正在编写一个小小的网络事物,并希望cicle抛出所有我的玩家,所以我使用ArrayLists和列表,但有很多Exception,因此深入到问题我用迭代器替换了它们,但是我在所有“it.next()”中都得到并发修改异常:/。 所以,如果请你可以帮助我了解问题:)。iterator.next()中的ConcurrentModificationException我找不到另一个解决方案

@Override 
public void run() 
{ 
    StringBuilder l = new StringBuilder(); 
    Iterator<UUID> pc; 
    Iterator<Packet> pa; 
    while (Jelly.isSTATUS()) { 
     pc = Jelly.getOnlinePlayers().keySet().iterator(); 
     while (pc.hasNext()) 
      try { 
       System.out.println("ENTERED!"); 
       Player p = Jelly.getOnlinePlayers().get(pc.next()); 
       System.out.println(p.getIGN()); 
       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); 

          Packetsts.get(p).remove(i); 
          l.setLength(0); 
         } 
        } catch (Exception ex) { } 
      } catch (ConcurrentModificationException ex){ ex.printStackTrace(); } 
    } 
    System.out.println("END!"); 
} 

谢谢:)

UPDATE:

@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!"); 
} 

线 “UUID U = pc.next();”请,我真的很讨厌并发修改例外:/

+2

如果您想在遍历该集合的同时修改集合,则必须通过调用其中一个迭代器的方法来完成修改。那么Packetsts.get(p).remove(i)有什么问题。删除必须通过调用iterator.remove()来完成。 –

+0

你最终的目标是什么?删除所有包后? – AbtPst

+1

此外,请停止捕获ConcurrentModiciationException和Exception。这些例外不应被捕获。特别是如果你忽略它们。 –

回答

1

这是不允许的

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

因为你是同时在其试图修改的ArrayList迭代。如何在循环开始时复制它?删除元素后,您的最终目标是什么?

+0

所以。我应该用“pa.remove()”替换它吗? – CavariuX

+0

umm,no。最好在循环开始时创建一个新列表 – AbtPst

+0

@CavariuX对于我来说'pa.remove()'听起来很合理,但迭代器不一定实现该方法,并且可能会抛出一个UnsupportedOperationException异常。 – yasd

相关问题