Java List.add () UnsupportedOperationException - PullRequest
178 голосов
/ 22 апреля 2011

Я пытаюсь добавить объекты в List<String> экземпляр, но он выдает UnsupportedOperationException.Кто-нибудь знает почему?

Мой код Java:

String[] membersArray = request.getParameterValues('members');
List<String> membersList = Arrays.asList(membersArray);

for (String member : membersList) {
    Person person = Dao.findByName(member);
    List<String> seeAlso;
    seeAlso = person.getSeeAlso();
    if (!seeAlso.contains(groupDn)){
        seeAlso.add(groupDn);
        person.setSeeAlso(seeAlso);
    }
}

Сообщение об ошибке:

java.lang.UnsupportedOperationException
    java.util.AbstractList.add(Unknown Source)
    java.util.AbstractList.add(Unknown Source)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Ответы [ 7 ]

371 голосов
/ 22 апреля 2011

Не каждая List реализация поддерживает метод add().

Одним из распространенных примеров является List, возвращаемое Arrays.asList(): документировано , а не для поддержки любых структурных изменений (т.е. удаление или добавление элементов) (выделено мое):

Возвращает список фиксированного размера , подкрепленный указанным массивом.

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

Вы можете узнать об этом, прочитав документацию UnsupportedOperationException и List.add(), в которой указано, что это «(дополнительная операция)». Точное значение этой фразы объясняется в верхней части документации List.

В качестве обходного пути вы можете создать копию списка для известной изменяемой реализации, такой как ArrayList:

seeAlso = new ArrayList<>(seeAlso);
4 голосов
/ 28 февраля 2013

Вы должны инициализировать свой список, см. Также:

List<String> seeAlso = new Vector<String>();

или

List<String> seeAlso = new ArrayList<String>();
2 голосов
/ 12 декабря 2018

Сформируйте концепцию наследования. Если какой-либо перикулярный метод недоступен в текущем классе, он будет искать этот метод в суперклассах.Если доступно, он выполняет.

Он выполняет AbstractList<E> class add() метод, который выбрасывает UnsupportedOperationException.


Когда вы конвертируете из массива в коллекционный объект.то есть, на основе массива для API на основе коллекции, то он предоставит вам объект коллекции фиксированного размера, потому что поведение массива имеет фиксированный размер.

java.util.Arrays.asList (T... а)

Образцы соусов для конформации.

public class Arrays {
    public static <T> List<T> asList(T... a) {
        return new java.util.Arrays.ArrayList.ArrayList<>(a); // Arrays Inner Class ArrayList
    }
    //...
    private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable {
        //...
    }
}
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    public void add(int index, E element) {
        throw new UnsupportedOperationException();
    }
    public E set(int index, E element) {
        throw new UnsupportedOperationException();
    }
    public E remove(int index) {
        throw new UnsupportedOperationException();
    }

    public Iterator<E> iterator() {
        return new Itr();
    }
    private class Itr implements Iterator<E> {
        //...
    }

    public ListIterator<E> listIterator() {
        return listIterator(0);
    }
    private class ListItr extends Itr implements ListIterator<E> {
        //...
    }
}

Из вышеприведенного источника вы можете заметить, что класс java.util.Arrays.ArrayList не @Override add(index, element), set(index, element), remove(index).Таким образом, из наследования он выполняет функцию супер AbstractList<E> class add(), которая выдает UnsupportedOperationException.

Поскольку AbstractList<E> является абстрактным классом, он обеспечивает реализацию iterator() and listIterator().Таким образом, мы можем перебрать объект списка.

List<String> list_of_Arrays = Arrays.asList(new String[] { "a", "b" ,"c"});

try {
    list_of_Arrays.add("Yashwanth.M");
} catch(java.lang.UnsupportedOperationException e) {
    System.out.println("List Interface executes AbstractList add() fucntion which throws UnsupportedOperationException.");
}
System.out.println("Arrays → List : " + list_of_Arrays);

Iterator<String> iterator = list_of_Arrays.iterator();
while (iterator.hasNext()) System.out.println("Iteration : " + iterator.next() );

ListIterator<String> listIterator = list_of_Arrays.listIterator();
while (listIterator.hasNext())    System.out.println("Forward  iteration : " + listIterator.next() );
while(listIterator.hasPrevious()) System.out.println("Backward iteration : " + listIterator.previous());

Вы даже можете создать массив массивов фиксированного размера. Класс коллекций Collections.unmodifiableList(list);

Источник выборки:

public class Collections {
    public static <T> List<T> unmodifiableList(List<? extends T> list) {
        return (list instanceof RandomAccess ?
                new UnmodifiableRandomAccessList<>(list) :
                new UnmodifiableList<>(list));
    }
}

A Collection - иногда называемый контейнером - это просто объект, который группирует несколько элементов в одну единицу.Коллекции используются для хранения, извлечения, обработки и передачи сводных данных.

@ см. Также

2 голосов
/ 23 ноября 2018

Многие из реализации List поддерживают ограниченную поддержку для добавления / удаления, и одним из них является Arrays.asList (membersArray). Вам необходимо вставить запись в java.util.ArrayList или использовать приведенный ниже подход для преобразования в ArrayList.

С минимальными изменениями в вашем коде, вы можете сделать ниже, чтобы преобразовать список в ArrayList. Первое решение имеет минимальные изменения в вашем решении, но второе, по-моему, более оптимизировано.

    String[] membersArray = request.getParameterValues('members');
    ArrayList<String> membersList = new ArrayList<>(Arrays.asList(membersArray));

OR

    String[] membersArray = request.getParameterValues('members');
    ArrayList<String> membersList = Stream.of(membersArray).collect(Collectors.toCollection(ArrayList::new));
0 голосов
/ 17 июня 2019

вместо использования add () мы можем использовать addall ()

{ seeAlso.addall(groupDn); }

add добавляет один элемент, а addAll добавляет каждый элемент из коллекции по одному. В конце оба метода возвращают true, если коллекция была изменена. В случае ArrayList это тривиально, потому что коллекция всегда изменяется, но другие коллекции, такие как Set, могут возвращать false, если добавляемые элементы уже есть.

0 голосов
/ 23 октября 2018

Список membersList = Arrays.asList (membersArray);

возвращает неизменный список, вам нужно сделать

new ArrayList <> (Arrays.asList (membersArray)); сделать его изменчивым

0 голосов
/ 22 апреля 2011

Вы не можете изменить результат запроса LDAP. Ваша проблема в этой строке:

seeAlso.add(groupDn);

Список seeAlso также нельзя изменить.

...