Перейти к основному содержимому

Список Java UnsupportedOperationException

· 2 мин. чтения

1. Обзор

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

java.util.List обладает большей функциональностью, чем может поддерживать обычный массив . Например, с помощью только одного вызова встроенного метода можно проверить, находится ли конкретный элемент внутри структуры. Обычно поэтому нам иногда нужно преобразовать массив в List или Collection .

Для ознакомления с основной реализацией Java ListArrayList — обратитесь к этой статье .

2. Исключение UnsupportedOperationException

Часто эта ошибка возникает, когда мы используем метод asList() из java.util.Arrays:

public static List asList(T... a)

Он возвращает:

  • список фиксированного размера по размеру заданного массива
  • элемент того же типа, что и в исходном массиве, и он должен быть объектом
  • элементы в том же порядке, ** ** что и в исходном массиве
  • список, который сериализуем и реализует RandomAccess

Поскольку T является varargs , мы можем передать массив или элементы напрямую в качестве параметров, и метод создаст инициализированный список фиксированного размера:

List<String> flowers = Arrays.asList("Ageratum", "Allium", "Poppy", "Catmint");

Мы также можем передать фактический массив :

String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List<String> flowerList = Arrays.asList(flowers);

Так как возвращенный List имеет фиксированный размер , мы не можем добавлять/удалять элементы .

Попытка добавить больше элементов вызовет UnsupportedOperationException :

String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" }; 
List<String> flowerList = Arrays.asList(flowers);
flowerList.add("Celosia");

Корень этого исключения заключается в том, что возвращаемый объект не реализует операцию add() , поскольку он не совпадает с java.util.ArrayList.

Это ArrayList из java.util.Arrays.

Другой способ получить такое же исключение — попытаться удалить элемент из полученного списка.

С другой стороны, есть способы получить изменяемый список на случай, если он нам понадобится.

Одним из них является создание ArrayList или любого другого списка непосредственно из результата asList() :

String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" }; 
List<String> flowerList = new ArrayList<>(Arrays.asList(flowers));

3. Заключение

В заключение важно понимать, что добавление дополнительных элементов в список может быть проблематичным не только для неизменяемых списков.

Как всегда, полный исходный код примеров доступен на GitHub .