Socket Hilfe mit Socket Thread und ArrayList

platofan23

Mitglied
Ich habe einen Serverquellcode mi einem Login

Quellcode liegt hier:
http://www.mediafire.com/folder/5m122pb3t8v59/ChatServer

Nun hab ich auch einen Client mit GUI auf JavaFx und Login. Der erste Login funktioniert, aber dann bekomme ich die Exception:

Exception in thread "Thread-6" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at Server.sendAnswerTrue(Server.java:118)
at Server$ClientHandler.run(Server.java:46)
at java.lang.Thread.run(Thread.java:748)

Kann mir da vielleicht einer sagen, was das bedeutet und ich wie ich das beheben kann?
 
Die Exception bedeutet, dass eine unerlaubte, nebenläufige Änderung eines Objekts festgestellt wurde. Das passiert meist, wenn man über eine Liste iteriert und gleichzeitig die Liste verändert. (s. https://docs.oracle.com/javase/8/docs/api/java/util/ConcurrentModificationException.html)

Dies ist in Deinem Code z. B. hier der Fall:
Java:
    public void sendAnswerTrue(String message) {
        System.out.println("Zugriff gewährt!");
        Iterator it=list_clientWriterLogin.iterator();
        while(it.hasNext()) {
            PrintWriter writer = (PrintWriter) it.next();
            writer.println("/l:true\n");
            writer.flush();
            list_clientWriterLogin.remove(writer);
        }

    }

Die Lösung ist in dem Fall relativ einfach: ersetze list_clientWriterLogin.remove(writer); durch it.remove();. Siehe https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html
 
Die Exception bedeutet, dass eine unerlaubte, nebenläufige Änderung eines Objekts festgestellt wurde. Das passiert meist, wenn man über eine Liste iteriert und gleichzeitig die Liste verändert. (s. https://docs.oracle.com/javase/8/docs/api/java/util/ConcurrentModificationException.html)

Dies ist in Deinem Code z. B. hier der Fall:
Java:
    public void sendAnswerTrue(String message) {
        System.out.println("Zugriff gewährt!");
        Iterator it=list_clientWriterLogin.iterator();
        while(it.hasNext()) {
            PrintWriter writer = (PrintWriter) it.next();
            writer.println("/l:true\n");
            writer.flush();
            list_clientWriterLogin.remove(writer);
        }

    }

Die Lösung ist in dem Fall relativ einfach: ersetze list_clientWriterLogin.remove(writer); durch it.remove();. Siehe https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html

Ich hab dazu jetzt eine current arraylist verwendet und es funktioniert. wenn nicht hätte ich das remove einfach wohl nach unten schieben müssen?
 
eine current arraylist verwendet
Was ist das?

wenn nicht hätte ich das remove einfach wohl nach unten schieben müssen?
Nein:
Die Lösung ist in dem Fall relativ einfach: ersetze list_clientWriterLogin.remove(writer); durch it.remove();

EDIT: habe mir nochmal das Stückchen Code angesehen. In dem Fall hättest Du tatsächlich danach einfach die Liste leeren können (nach der Schleife ein list_clientWriterLogin.clear()😉.
 

Neue Themen


Zurück
Oben