Java List.add()UnsupportedOperationException

FAj*_*jir 197 java exception list arraylist unsupportedoperation

我尝试将对象添加到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);
    }
}
Run Code Online (Sandbox Code Playgroud)

错误消息:

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)

Joa*_*uer 400

并非每个List实现都支持该add()方法.

一个常见的例子是List返回者Arrays.asList():它被记录为支持任何结构修改(即删除或添加元素)(强调我的):

返回由指定数组支持的固定大小的列表.

即使这不是List您尝试修改的具体内容,答案仍然适用于其他List不可变的实现或仅允许某些选定的更改.

您可以通过阅读文档来了解这一点,UnsupportedOperationException以及List.add()哪些文档是"(可选操作)".List文档顶部解释了该短语的确切含义.

作为一种解决方法,您可以将列表的副本创建为已知可修改的实现,例如ArrayList:

seeAlso = new ArrayList<>(seeAlso);
Run Code Online (Sandbox Code Playgroud)

  • @Florito:这会有效:`List <String> listMembres = new ArrayList <String>(Arrays.asList(tabMembres));`:) (81认同)
  • 不,不是真的.如果你想在一个不允许添加的`List`实现中添加一个元素,那么你必须将`List`复制到一个实现(`ArrayList`是一个常见的候选者)并添加到那个. (2认同)

krm*_*007 11

许多 List 实现支持对添加/删除的有限支持,Arrays.asList(membersArray) 就是其中之一。您需要在 java.util.ArrayList 中插入记录或使用以下方法转换为 ArrayList。

通过对代码进行最小的更改,您可以执行以下操作将列表转换为 ArrayList。第一个解决方案对您的解决方案进行了最小的更改,但我想第二个解决方案更加优化。

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

或者

    String[] membersArray = request.getParameterValues('members');
    ArrayList<String> membersList = Stream.of(membersArray).collect(Collectors.toCollection(ArrayList::new));
Run Code Online (Sandbox Code Playgroud)


Yas*_*ash 5

从继承的概念来看,如果某个特定的方法在当前类中不可用,它将在超类中搜索该方法。如果可用则执行。

\n\n
\n

它执行抛出 的AbstractList<E>类方法。add()UnsupportedOperationException

\n
\n\n
\n\n

当您从数组转换为集合对象时。即,基于数组到基于集合的API,那么它将为您提供固定大小的集合对象,因为数组的行为是固定大小的。

\n\n
\n

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

\n
\n\n

构象来源样本。\n

\n\n
public class Arrays {\n    public static <T> List<T> asList(T... a) {\n        return new java.util.Arrays.ArrayList.ArrayList<>(a); // Arrays Inner Class ArrayList\n    }\n    //...\n    private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable {\n        //...\n    }\n}\npublic abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {\n    public void add(int index, E element) {\n        throw new UnsupportedOperationException();\n    }\n    public E set(int index, E element) {\n        throw new UnsupportedOperationException();\n    }\n    public E remove(int index) {\n        throw new UnsupportedOperationException();\n    }\n\n    public Iterator<E> iterator() {\n        return new Itr();\n    }\n    private class Itr implements Iterator<E> {\n        //...\n    }\n\n    public ListIterator<E> listIterator() {\n        return listIterator(0);\n    }\n    private class ListItr extends Itr implements ListIterator<E> {\n        //...\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

从上面的源代码中,您可能会发现该类java.util.Arrays.ArrayList没有@Override add(index, element), set(index, element), remove(index)。因此,从继承中,它执行抛出 的超AbstractList<E>类函数。add()UnsupportedOperationException

\n\n

作为AbstractList<E>一个抽象类,它提供了iterator() and listIterator(). 因此,我们可以迭代列表对象。

\n\n
public class Arrays {\n    public static <T> List<T> asList(T... a) {\n        return new java.util.Arrays.ArrayList.ArrayList<>(a); // Arrays Inner Class ArrayList\n    }\n    //...\n    private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable {\n        //...\n    }\n}\npublic abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {\n    public void add(int index, E element) {\n        throw new UnsupportedOperationException();\n    }\n    public E set(int index, E element) {\n        throw new UnsupportedOperationException();\n    }\n    public E remove(int index) {\n        throw new UnsupportedOperationException();\n    }\n\n    public Iterator<E> iterator() {\n        return new Itr();\n    }\n    private class Itr implements Iterator<E> {\n        //...\n    }\n\n    public ListIterator<E> listIterator() {\n        return listIterator(0);\n    }\n    private class ListItr extends Itr implements ListIterator<E> {\n        //...\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您甚至可以从 Collections 类创建固定大小的数组Collections.unmodifiableList(list);

\n\n

示例来源:\n

\n\n
public class Collections {\n    public static <T> List<T> unmodifiableList(List<? extends T> list) {\n        return (list instanceof RandomAccess ?\n                new UnmodifiableRandomAccessList<>(list) :\n                new UnmodifiableList<>(list));\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

\ Collectionxe2\x80\x94 有时称为容器 \xe2\x80\x94 只是一个将多个元素分组为单个单元的对象。集合用于存储、检索、操作和通信聚合数据。

\n\n

@也可以看看

\n\n\n