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




В первом цикле вы получаете сообщение об ошибке, потому что пытаетесь изменить коллекцию, которую вы просматриваете в данный момент.
Второй работает, потому что вместо обхода коллекции вы получаете элемент из коллекции, а затем вызываете для него удаление.
Проверьте это: https://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html
Я вижу, теперь это кажется очевидным! Любая идея по моему второму вопросу, является ли это плохой практикой, или я могу использовать это?
Лучший способ удалить элемент из списка — использовать итератор.
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 нить
Не могли бы вы показать нам свой код и особенно этот цикл?