jak poprawnie niszczyć elementy kolekcji...

jak poprawnie niszczyć elementy kolekcji...
0

napisałem sobie taki oto fragment, w celu pozamykania wszystkich okienek

            //CloseFrame extends JFrame implements Closable
            Iterator<ClosableFrame> iterator = xset.iterator();
           
            while(iterator.hasNext()) {
                    ClosableFrame frame = iterator.next();
                    frame.close();
                    frame.dispose();
            }

ale niestety, przy dwóch okienkach w xsecie, program się wysypuje następująco:
Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
at java.util.HashMap$KeyIterator.next(Unknown Source)
at ... i dalej jest wskazanie na miejsce w kodzie: ClosableFrame frame = iterator.next();

oczywiście najpierw zrobiłem tak:

            Iterator<ClosableFrame> iterator = xset.iterator();
           
            while(iterator.hasNext()) {
                    final ClosableFrame frame = iterator.next();
                    SwingUtilities.invokeLater(new Runnable() {
                            @Override
                            public void run() {
                                     frame.close();
                                    frame.dispose();
                            }
                    });
            }

program się nie wysypuje, no ale dalej nie mam pewności, że się nic nie wysypie później (np. przy większej ilości okienek)
((bo przecież przetwarzanie kolejki swinga może się skończyć wcześniej niż pociągnięcie z iteratora -> i tak z pewnością się może stać!!))

Co więc powinienem zrobić...
Z góry dzięki za pomoc.

(Aha, żeby uniknąć nieporozumień cały kod - ten zewnętrzny, tak czy inaczej jest wykonywany w wątku swinga (przez invokeLater Klasy SwingUtyliteis) - to tak na wszelki wypadek)

karolex

Z góry dzięki za pomoc

Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:18 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
1

Dodaj jeszcze iterator.remove() zanim usuniesz ramkę.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
0

Wyglada na to ze w czasie gdy Ty iterujesz sobie, cos dokonuje zmian w xset, np dodaje cos lub odejmuje.
Iterator.remove nie ma tu nic do rzeczy.

0
Koziołek napisał(a)

Dodaj jeszcze iterator.remove() zanim usuniesz ramkę.

wielkie, wielkie dzięki - oto rozwiązanie mojego problemu :) - nawet zacząłem czytać o SwingUtylities (ta wiedza mi się zawsze przyda ;), ale tu chodziło wałaśnie o remove() - wielki dzięki!!

::. napisał(a)

Wyglada na to ze w czasie
gdy Ty iterujesz sobie, cos dokonuje zmian w xset, np dodaje cos lub odejmuje.
Iterator.remove nie ma tu nic do rzeczy.

w tym wypadku chodziło właśnie o iterator.remove() z jednego z powodów o którym piszesz - usuwania z xset, którego tutaj nie widać... jednak remove przed frame.close() załatwia zprawę.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.