我尝试向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)
并不是每个List实现都支持add()方法。
一个常见的例子是Arrays.asList()返回的List:它被记录为不支持任何结构修改(即删除或添加元素)(强调我的):
返回指定数组支持的固定大小的列表。
即使这不是您试图修改的特定List,答案仍然适用于其他不可变或只允许某些选定更改的List实现。
您可以通过阅读UnsupportedOperationException和List.add()的文档来了解这一点,它们将此记录为“(可选操作)”。这个短语的确切含义在List文档的顶部进行了解释。
作为一种变通方法,你可以创建一个列表的副本到一个已知的可修改的实现,如ArrayList:
seeAlso = new ArrayList<>(seeAlso);
许多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));
并不是每个List实现都支持add()方法。
一个常见的例子是Arrays.asList()返回的List:它被记录为不支持任何结构修改(即删除或添加元素)(强调我的):
返回指定数组支持的固定大小的列表。
即使这不是您试图修改的特定List,答案仍然适用于其他不可变或只允许某些选定更改的List实现。
您可以通过阅读UnsupportedOperationException和List.add()的文档来了解这一点,它们将此记录为“(可选操作)”。这个短语的确切含义在List文档的顶部进行了解释。
作为一种变通方法,你可以创建一个列表的副本到一个已知的可修改的实现,如ArrayList:
seeAlso = new ArrayList<>(seeAlso);