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)

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

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

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

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

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

作为一种解决方法,您可以创build一个列表副本到一个已知可修改的实现,如ArrayList

 seeAlso = new ArrayList<>(seeAlso); 

你必须初始化你的列表seeAlso:

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

要么

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

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

 seeAlso.add(groupDn); 

seeAlso列表是不可修改的。