J'essaie d'ajouter des objets à une List<String>
instance mais cela lance un UnsupportedOperationException
. Quelqu'un sait-il pourquoi?
Mon code 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);
}
}
Le message d'erreur:
java.lang.UnsupportedOperationException java.util.AbstractList.add (Source inconnue) java.util.AbstractList.add (Source inconnue) 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
implémentation qui ne permet pas l'ajout, vous devrez le copierList
dans une implémentation qui le fait (ArrayList
est un candidat courant) et y ajouter.De nombreuses implémentations de la liste prennent en charge la prise en charge limitée de l'ajout / suppression, et Arrays.asList (membersArray) en fait partie. Vous devez insérer l'enregistrement dans java.util.ArrayList ou utiliser l'approche ci-dessous pour convertir en ArrayList.
Avec la modification minimale de votre code, vous pouvez faire ci-dessous pour convertir une liste en ArrayList. La première solution est d'avoir un changement minimum dans votre solution, mais la seconde est plus optimisée, je suppose.
OU
la source
Formez le concept d'héritage, si une méthode perticulaire n'est pas disponible dans la classe actuelle, elle recherchera cette méthode dans les super classes. S'il est disponible, il s'exécute.
Lorsque vous convertissez un tableau en un objet de collection. c'est-à-dire, basé sur un tableau vers une API basée sur une collection, il vous fournira un objet de collection de taille fixe, car le comportement d'Array est de taille fixe.
Échantillons de Souce pour la conformation.
Formez la source ci-dessus, vous remarquerez que la
java.util.Arrays.ArrayList
classe ne le fait pas@Override add(index, element), set(index, element), remove(index)
. Donc, à partir de l'héritage, il exécute une fonction de superAbstractList<E>
classeadd()
qui lanceUnsupportedOperationException
.Comme
AbstractList<E>
c'est une classe abstraite, elle fournit l'implémentation àiterator() and listIterator()
. Donc, que nous pouvons itérer sur l'objet liste.Vous pouvez même créer une classe Collections sous forme de tableau à taille fixe
Collections.unmodifiableList(list);
Exemple de source:
Un
Collection
- parfois appelé conteneur - est simplement un objet qui regroupe plusieurs éléments en une seule unité. Les collections sont utilisées pour stocker, récupérer, manipuler et communiquer des données agrégées.@voir également
vs
HashTablela source
Vous devez initialiser votre liste voir également:
ou
la source
UnsupportedOperationException
deadd()
. Vous obtiendriez un NPE à la place.List membersList = Arrays.asList (membersArray);
renvoie une liste immuable, ce que vous devez faire est
new ArrayList <> (Arrays.asList (membersArray)); pour le rendre mutable
la source
au lieu d'utiliser add (), nous pouvons utiliser addall ()
add ajoute un seul élément, tandis que addAll ajoute chaque élément de la collection un par un. Au final, les deux méthodes renvoient true si la collection a été modifiée. Dans le cas d'ArrayList, cela est trivial, car la collection est toujours modifiée, mais d'autres collections, telles que Set, peuvent retourner false si les éléments ajoutés sont déjà là.
la source
Vous ne pouvez pas modifier un résultat d'une requête LDAP. Votre problème est dans cette ligne:
La liste seeAlso n'est pas modifiable.
la source