Рубрики
Без рубрики

Java List UnsupportedOperationException

Посмотрите на исключение UnsupportedOperationException и как его избежать при работе со списками в Java.

Автор оригинала: baeldung.

1. Обзор

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

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

Для ознакомления с основной реализацией Java ListArrayList – пожалуйста, обратитесь к этой статье .

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

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

public static List asList(T... a)

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

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

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

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

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

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

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

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

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

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

Это ArrayList , от java.util.Массивы.

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

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

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

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

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

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

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