1. Обзор
В этом кратком руководстве мы обсудим общее Исключение , которое может возникнуть при работе с некоторыми API большинства реализаций List – исключение UnsupportedOperationException .
A java.util.List обладает большей функциональностью, чем может поддерживать обычный a rray . Например, с помощью только одного встроенного вызова метода можно проверить, находится ли определенный элемент внутри структуры. Обычно именно поэтому нам иногда нужно преобразовать массив в Список или Коллекцию .
Для ознакомления с основной реализацией Java List – ArrayList – пожалуйста, обратитесь к этой статье .
2. Исключение UnsupportedOperationException
Часто эта ошибка возникает, когда мы используем asList() метод из java.util.Массивы:
public static List asList(T... a)
Он возвращается:
- фиксированный размер Список по состоянию на размер данного массив
- элемент того же типа, что и в исходном массиве , и он должен быть объектом
- элементы в том же порядке , что и в исходном массиве
- список, который является сериализуемым и реализует RandomAccess
Поскольку T-это varargs , мы можем передать массив или элементы непосредственно в качестве параметров, и метод создаст инициализированный список фиксированного размера:
Listflowers = Arrays.asList("Ageratum", "Allium", "Poppy", "Catmint");
Мы также можем передать фактический массив :
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" }; ListflowerList = Arrays.asList(flowers);
Поскольку возвращаемый Список имеет фиксированный размер List , мы не можем добавлять/удалять элементы .
Попытка добавить больше элементов приведет к исключению UnsupportedOperationException :
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" }; ListflowerList = Arrays.asList(flowers); flowerList.add("Celosia");
Корень этого Исключения заключается в том, что возвращаемый объект не реализует операцию add () , поскольку он не совпадает с java.util.ArrayList.
Это ArrayList , от java.util.Массивы.
Другой способ получить такое же исключение-попытаться удалить элемент из полученного списка.
С другой стороны, есть способы получить изменяемый Список на случай, если он нам понадобится.
Один из них-создать ArrayList или любой другой список непосредственно из результата asList() :
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" }; ListflowerList = new ArrayList<>(Arrays.asList(flowers));
3. Заключение
В заключение важно понять, что добавление большего количества элементов в список может быть проблематичным не только для неизменяемых списков.
Как всегда, полный исходный код примеров доступен на GitHub .