Java List.add() UnsupportedOperationException

我尝试将对象添加到实例,但它会抛出一个.有谁知道为什么吗?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)

答案 1

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

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

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

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

您可以通过阅读UnsupportedOperationExceptionList.add()的文档来了解这一点,这些文档将其记录为“(可选操作)”。此短语的确切含义在文档顶部进行了解释。List

作为一种解决方法,您可以将列表的副本创建到已知可修改的实现中,例如: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));