Socket Hilfe mit Socket Thread und ArrayList

Diskutiere Hilfe mit Socket Thread und ArrayList im Netzwerkprogrammierung Bereich.
platofan23

platofan23

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?
 
mihe7

mihe7

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
 
platofan23

platofan23

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?
 
mihe7

mihe7

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();).
 
Thema: 

Hilfe mit Socket Thread und ArrayList

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben