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.

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