9.0 如何处理Java 中的List.add() UnsupportedOperationException | Java Debug 笔记

207 阅读1分钟

本文正在参加「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));