Java List.add()UnsupportedOperationException

问题

我尝试将对象添加到aList<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 热门回答(287 赞)

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

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

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

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

你可以通过阅读UnsupportedOperationExceptionList.add()的文档来了解这一点,该文档将其记录为"(可选操作)"。这个短语的确切含义在List文档的顶部解释。

作为一种解决方法,你可以将列表的副本创建为已知可修改的实现,如ArrayList

seeAlso = new ArrayList<>(seeAlso);

#2 热门回答(3 赞)

你必须初始化List seeAlso:

List<String> seeAlso = new Vector<String>();

要么

List<String> seeAlso = new ArrayList<String>();

#3 热门回答(-1 赞)

你无法修改LDAP查询的结果。你的问题在于这一行:

seeAlso.add(groupDn);

seeAlso列表是不可修改的。