2016-04-18 4 views
1

クライアントがソケットからの接続を閉じるときにエラーが発生しました。起こりそうなことは、ユーザーがクライアントを閉じ、サーバーがこれを受け取り、相対整数値で格納されている接続されているユーザーを減らす必要があるということです。しかし、ユーザー関数の削除のforループに関するエラーが表示されます。ClientHandlerからユーザーを削除する際のエラー

public synchronized void removeUsers(Socket client,int clientUser) 
     { 
      int index=0; 
      for (ClientHandler newHandler:userList) 
      { 
       if(newHandler.getUserId() == clientUser) 
       { 
        try 
        { 
         client.close(); 
         Thread.currentThread().isInterrupted(); 
         userList.remove(index); 
        } 
        catch (IOException e) 
        { 
         System.out.println("Unable to disconnect!"); 
         System.exit(1); 
        } 
       } 
       index++; 
      } 
     } 

クライアントハンドラの実行:

public void run() 
     { 
      String message; 
      message = input.nextLine(); //Note method! 
      getMessage(message); 
      System.out.println(message.substring(0, count+1)+"-"+message.substring(count+1)); 
      while (!message.substring(0, count+1).equals("***CLOSE***")) 
      { 
       if(message.equals(user.getItemName(1)+"$status$")|| //checks for status of Ball 
         message.equals(user.getItemName(2)+"$status$")) 
       { 
        if (user.BidItem(user.getItemName(1))) 
        { 
         System.out.println("Top bid for " +    //posts for server 
          message.substring(0, count+1) + " is: " 
          + user.getTopBid(message.substring(0, count+1))); 

         output.println("Top bid for " +   //posts for client 
          message.substring(0, count+1) + " is: " 
          + user.getTopBid(message.substring(0, count+1)) 
          + " by User" + 
          user.getTopBidder(message.substring(0, count+1))); 
        } 
        else 
        { 
         System.out.println("-1"); 
         output.println("-1"); 
        } 
       } 
       else 
       { 
        if(user.BidItem(message.substring(count+2))) //same but now for Plate 
        { 
         if(user.isGrtrThanTopBid(message.substring(count+2), 
           Double.parseDouble(message.substring(0, count+1)))) 
         { 
          user.setTopBid(message.substring(count+2), 
            Double.parseDouble(message.substring(0, count+1)), clientUser); 
          System.out.println("Bid Accepted for " + message.substring(count+2)); 
          output.println("Bid Accepted for " + message.substring(count+2)); 
         } 
         else 
         { 
          System.out.println("Low bid for " + message.substring(count+2)); 
          output.println("Low bid for " + message.substring(count+2)); 
         } 
        } 
        else 
        { 
         System.out.println("Late bid for " + message.substring(count+2)); 
         output.println("Late bid for " + message.substring(count+2)); 
        } 
       } 
       message = input.nextLine(); 
       count = 0; 
       getMessage(message); 
      } 
      output.println(" messages received."); 
      System.out.println("\n* Closing connection... *"); 
      user.removeUsers(client,clientUser); 
     } 

完全なエラーはここにある:

Exception in thread "Thread-2" java.util.ConcurrentModificationException 
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source) 
    at java.util.ArrayList$Itr.next(Unknown Source) 
    at Users.removeUsers(AuctionServer.java:211) //Relates to top of for loop 
    at ClientHandler.run(AuctionServer.java:435) 

答えて

0

ときにそれらのあなた反復するあなたはリストからオブジェクトを削除することはできません。

これを試してください。

代わりにキューを使用してください。

Queue queue = new LinkedList<Client>(); 
int index=0; 
for (ClientHandler newHandler:userList) 
{ 
    if(newHandler.getUserId() == clientUser) 
    { 
     try 
     { 
      client.close(); 
      Thread.currentThread().isInterrupted(); 
      queue.add(userList.get(index)); 
     } 
     catch (IOException e) 
     { 
      System.out.println("Unable to disconnect!"); 
      System.exit(1); 
     } 
    } 
    index++; 
} 

while(!queue.isEmpty()) { 
    userList.remove(queue.remove()); 
}