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)
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)
从继承的概念来看,如果某个特定的方法在当前类中不可用,它将在超类中搜索该方法。如果可用则执行。
\n\n\n\n\n它执行抛出 的
\nAbstractList<E>
类方法。add()
UnsupportedOperationException
当您从数组转换为集合对象时。即,基于数组到基于集合的API,那么它将为您提供固定大小的集合对象,因为数组的行为是固定大小的。
\n\n\n\n\njava.util.Arrays.asList( T... a )
\n
构象来源样本。\n
\n\npublic 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
作为AbstractList<E>
一个抽象类,它提供了iterator() and listIterator()
. 因此,我们可以迭代列表对象。
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\npublic 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\ Collection
xe2\x80\x94 有时称为容器 \xe2\x80\x94 只是一个将多个元素分组为单个单元的对象。集合用于存储、检索、操作和通信聚合数据。
@也可以看看
\n\n\n