1. Обзор
В этом кратком руководстве мы обсудим распространенное исключение
, которое может возникнуть при работе с некоторыми API большинства реализаций списка
— UnsupportedOperationException
.
java.util.List обладает
большей функциональностью, чем может поддерживать обычный массив
. Например, с помощью только одного вызова встроенного метода можно проверить, находится ли конкретный элемент внутри структуры. Обычно поэтому нам иногда нужно преобразовать массив
в List
или Collection
.
Для ознакомления с основной реализацией Java List
— ArrayList
— обратитесь к этой статье .
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 .