Eu tento adicionar objetos a uma List<String>
instância, mas lança um UnsupportedOperationException
. Alguem sabe por quê?
Meu código 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);
}
}
A mensagem de erro:
java.lang.UnsupportedOperationException java.util.AbstractList.add (fonte desconhecida) java.util.AbstractList.add (fonte desconhecida) javax.servlet.http.HttpServlet.service (HttpServlet.java:641) javax.servlet.http.HttpServlet.service (HttpServlet.java:722)
List<String> listMembres = new ArrayList<String>(Arrays.asList(tabMembres));
:)List
implementação que não permite adição, precisará copiá-loList
para uma implementação que faz (ArrayList
é um candidato comum) e adicionar a isso.Muitas das implementações da Lista oferecem suporte limitado para adicionar / remover, e o Arrays.asList (membersArray) é um deles. Você precisa inserir o registro em java.util.ArrayList ou usar a abordagem abaixo para converter em ArrayList.
Com a alteração mínima no seu código, você pode fazer abaixo para converter uma lista em ArrayList. A primeira solução é ter uma alteração mínima na sua solução, mas a segunda é mais otimizada, eu acho.
OU
fonte
Forme o conceito de herança. Se algum método perticular não estiver disponível na classe atual, ele buscará esse método nas superclasses. Se disponível, ele é executado.
Quando você está convertendo de uma matriz para um objeto de coleção. ou seja, com base em array para API baseada em coleção, ele fornecerá um objeto de coleção de tamanho fixo, porque o comportamento da matriz é de tamanho fixo.
Amostras de molho para conformação.
Forme a fonte acima, você pode observar que a
java.util.Arrays.ArrayList
classe não@Override add(index, element), set(index, element), remove(index)
. Portanto, a partir da herança, ele executa a função de superAbstractList<E>
classeadd()
que lançaUnsupportedOperationException
.Como
AbstractList<E>
é uma classe abstrata, ela fornece a implementaçãoiterator() and listIterator()
. Assim, podemos iterar sobre o objeto da lista.Você pode até criar um array de tamanho fixo na classe Collections
Collections.unmodifiableList(list);
Fonte da amostra:
A
Collection
- às vezes chamado de contêiner - é simplesmente um objeto que agrupa vários elementos em uma única unidade. As coleções são usadas para armazenar, recuperar, manipular e comunicar dados agregados.@Veja também
vs
HashTablefonte
Você deve inicializar sua lista, ver também:
ou
fonte
UnsupportedOperationException
inadd()
. Você receberia um NPE.Lista membersList = Arrays.asList (membersArray);
retorna uma lista imutável, o que você precisa fazer é
novo ArrayList <> (Arrays.asList (membersArray)); para torná-lo mutável
fonte
em vez de usar add (), podemos usar addall ()
add adiciona um único item, enquanto addAll adiciona cada item da coleção, um por um. No final, os dois métodos retornam true se a coleção foi modificada. No caso de ArrayList, isso é trivial, porque a coleção é sempre modificada, mas outras coleções, como Set, podem retornar false se os itens adicionados já estiverem lá.
fonte
Você não pode modificar um resultado de uma consulta LDAP. Seu problema está nesta linha:
A lista seeAlso não pode ser modificada.
fonte