JavaFx — исключение ConcurrentModificationException

Прочитав здесь другие вопросы, я считаю, что был бы прав, если бы сказал, что эта ошибка возникает, когда вы пытаетесь изменить дочерние элементы узла во время итерации по нему.

Я видел несколько методов, которые я мог бы использовать для решения этой проблемы, однако, когда я возился со своим кодом, я заметил, что замена моего расширенного цикла for на обычный цикл for решила проблему.

Мой первый вопрос: почему это работает? Мне кажется, что я все еще модифицирую дочерние элементы узла, перебирая их, поэтому я не понимаю, почему это теперь работает. Во-вторых, есть ли что-то плохое в преодолении ошибки таким образом?

Обновлять

Как и просили, вот фрагмент кода

    ArrayList<Button> list = new ArrayList<Button>();
    Button b1 = new Button();
    Button b2 = new Button();
    Button b3 = new Button();
    Collections.addAll(list, b1, b2, b3);

    //Error
    for(Button b : list) {
        list.remove(b);
    }

    //No Error
    for(int i = 0; i < list.size(); i++) {
        Button b = list.get(i);
        list.remove(b);
    }

Не могли бы вы показать нам свой код и особенно этот цикл?

deHaar 27.03.2019 09:01

Пожалуйста, добавьте немного Минимальный, полный и проверяемый пример

Mohamed Benmahdjoub 27.03.2019 09:01

Нам нужно увидеть ваш код, я не уверен, что вы делаете. Но, как правило, если вы хотите просмотреть список, а также удалить элементы из этого списка, возможно, лучший способ сделать это — использовать Итератор.удалить().

Kalec 27.03.2019 09:04

Я обновил код.

user2099816 27.03.2019 09:15

Вы проверили содержимое списка после ConcurrentModificationException? Все ли элементы еще присутствуют? Я протестировал его с List<Integer>, и расширенный for-цикл выдал такой Exception, но также и удалил элемент, который не должен был быть удален. Вы можете легко добиться того, чего хотите в Java 8, используя list.removeIf(/* your condition */); Если вам не нужно условие и вы хотите удалить все элементы, как в ваших циклах, вы можете просто написать list = new ArrayList();

deHaar 27.03.2019 09:36

а) это не связано с javafx, просто поведение списка java б) в то время как второй не будет лаять, он не будет делать то, что вы ожидаете (по крайней мере, я предполагаю, что вы ожидаете;) Подсказка: проверьте размер списка после цикла заканчивается

kleopatra 27.03.2019 10:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
6
207
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В первом цикле вы получаете сообщение об ошибке, потому что пытаетесь изменить коллекцию, которую вы просматриваете в данный момент.

Второй работает, потому что вместо обхода коллекции вы получаете элемент из коллекции, а затем вызываете для него удаление.

Проверьте это: https://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html

Я вижу, теперь это кажется очевидным! Любая идея по моему второму вопросу, является ли это плохой практикой, или я могу использовать это?

user2099816 27.03.2019 09:43

Лучший способ удалить элемент из списка — использовать итератор.

Note that Iterator.remove() is the only safe way to modify a collection during iteration; the behavior is unspecified if the underlying collection is modified in any other way while the iteration is in progress.

Вы можете найти больше в этом stackoverflow нить

Другие вопросы по теме