本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>
我尝试将对象添加到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(未知源)
java.util.AbstractList.add(未知源)
javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
javax.servlet.http.HttpServlet .service(HttpServlet.java:722)
回答1:
并非每个List实现都支持该add()方法。
一个常见的示例是通过以下方式List返回的Arrays.asList():它被记录为不支持任何结构修改(即,删除或添加元素)
返回由指定数组支持的固定大小的列表。
即使那不是您要修改的特定List,我的答案仍然适用于不可变或仅允许某些选定更改的其他List实现。
您可以通过阅读UnsupportedOperationException和List.add()的文档来找到有关此内容的信息,这些文档将其记录为“(可选操作)”。 该短语的确切含义在列表文档的顶部进行了说明。
作为一种解决方法,您可以将列表的副本创建到诸如ArrayList的已知可修改实现中:
seeAlso = new ArrayList<>(seeAlso);
回答2:
许多List实现对添加/删除的支持有限,而Arrays.asList(membersArray)就是其中之一。 您需要将记录插入java.util.ArrayList或使用以下方法转换为ArrayList。
只需对代码进行最少的更改,您就可以在下面执行将列表转换为ArrayList的操作。 我猜第一种解决方案的解决方案更改最少,但是第二种解决方案更优化。
String[] membersArray = request.getParameterValues('members');
ArrayList<String> membersList = new ArrayList<>(Arrays.asList(membersArray));
String[] membersArray = request.getParameterValues('members');
ArrayList<String> membersList = Stream.of(membersArray).collect(Collectors.toCollection(ArrayList::new));