我尝试向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 membersList = Arrays.asList(membersArray);

返回不可变列表,你需要做的是

新ArrayList < > (arrays . aslist (membersArray));使它可变

其他回答

并不是每个List实现都支持add()方法。

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

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

即使这不是您试图修改的特定List,答案仍然适用于其他不可变或只允许某些选定更改的List实现。

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

作为一种变通方法,你可以创建一个列表的副本到一个已知的可修改的实现,如ArrayList:

seeAlso = new ArrayList<>(seeAlso);

不能修改LDAP查询的结果。你的问题在这一行:

seeAlso.add(groupDn);

seeAlso列表是不可修改的。

你必须初始化你的列表

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

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

如果您试图添加到集合返回的List<T>,也会出现此异常。singletonList o (T):

返回只包含指定对象的不可变列表。返回的列表是可序列化的。

JVM没有为Collections.singletonList实现add()

List membersList = Arrays.asList(membersArray);

返回不可变列表,你需要做的是

新ArrayList < > (arrays . aslist (membersArray));使它可变