2016-04-18 6 views
1

Ich habe einen Fehler, wenn ein Client die Verbindung vom Socket schließt. Was passieren soll, ist, dass der Benutzer seinen Client schließt, der Server erhält dies dann und sollte die verbundenen Benutzer dekrementieren, die in einem relativen ganzzahligen Wert gespeichert sind. Ich erhalte jedoch einen Fehler in Bezug auf die for-Schleife auf dem Entfernen einer Benutzerfunktion.Fehler beim Entfernen des Benutzers von 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++; 
      } 
     } 

Client-Handler laufen:

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); 
     } 

Der vollständige Fehler ist hier:

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) 

Antwort

0

Sie können keine Objekte aus Listen entfernen, wenn Sie wiederholt sich auf sie.

Versuchen Sie es.

Verwenden Sie stattdessen eine Warteschlange.

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()); 
} 
Verwandte Themen