UnsupportedOperationException vs ConcurrentModificationExcetion
У меня есть код, который добавляет данные в список. Я не понимаю, почему UnsupportedOperationException
брошен в одном случае и ConcurrentModificationException
в другом. Я добавляю данные в список в обоих случаях, а затем пытаюсь удалить данные списка, перебирая список. То, что я до сих пор читал, это то, что всякий раз, когда вносится какая-либо модификация в сборку с ошибками,ConcurrentModificationException
брошен Так почему же такое разное поведение в обоих этих случаях?
List<String> animalList = new ArrayList<>();
animalList.add("cat");
animalList.add("dog");
animalList.add("bear");
animalList.add("lion");
Iterator<String> iter = animalList.iterator();
while(iter.hasNext()){
String animal = iter.next();
System.out.println(animal);
animalList.remove(3);
}
Этот код выкидывает ConcurrentModificationException
String[] strings = { "Java", "Honk", "Test" };
List<String> list = Arrays.asList(strings);
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String name = iterator.next();
System.out.println(name);
list.remove(3);
}
пока этот бросает UnsupportedOperationException
2 ответа
Для блока кода, где вы получаете ConcurrentModificationException
, вы получите это исключение, потому что вы создали итератор на List
затем удаление непосредственно из списка из цикла, чтобы итератор имел проблемы. Вы должны использовать remove()
сам метод итератора - Iterator.remove ().
Вы должны непосредственно удалить элемент из списка при удалении из цикла итератора. Смотрите это еще один вопрос
Во втором случае с Arrays.asList
, вы получите List
но фактический объект списка не может быть ArrayList
а также remove(int index)
операция необязательна при List
интерфейс. Видеть это
В целом, насколько UnsupportedOperationException
обеспокоен тем, что в первом случае вам гарантировано ArrayList
и для этого класса, операция удаления поддерживается, см. это
Во втором случае вы не можете быть так уверены. Обратитесь к документации Arrays.asList
где написано, что возвращен список фиксированного размера, поэтому определенные операции не поддерживаются.
Arrays.asList не возвращает ArrayList. На самом деле, возвращаемый список не подлежит изменению, поэтому, когда вы пытаетесь изменить его, он генерирует исключение UnsupportedOperationException.