我尝试向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)

当前回答

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

seeAlso.add(groupDn);

seeAlso列表是不可修改的。

其他回答

List membersList = Arrays.asList(membersArray);

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

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

许多List实现支持有限的添加/删除支持,Arrays.asList(membersArray)就是其中之一。您需要在java.util.ArrayList中插入记录,或者使用下面的方法转换为ArrayList。

只需对代码进行最小的修改,就可以实现以下功能,将一个列表转换为ArrayList。第一个解决方案是在解决方案中有最小的变化,但我认为第二个解决方案更加优化。

    String[] membersArray = request.getParameterValues('members');
    ArrayList<String> membersList = new ArrayList<>(Arrays.asList(membersArray));

OR

    String[] membersArray = request.getParameterValues('members');
    ArrayList<String> membersList = Stream.of(membersArray).collect(Collectors.toCollection(ArrayList::new));

我们可以使用addall()代替add()

{ seeAlso.addall(groupDn); }

add添加单个项,而addAll则逐个添加集合中的每个项。最后,如果集合已被修改,两个方法都返回true。对于ArrayList来说,这是微不足道的,因为集合总是被修改,但其他集合,如Set,如果添加的项已经在那里,则可能返回false。

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

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

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

你必须初始化你的列表

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

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