Lista Java UnsupportedOperationException

Lista Java UnsupportedOperationException

1. Visão geral

Neste tutorial rápido, discutiremos umException comum que pode ocorrer ao trabalhar com algumas das APIs da maioria das implementações deList - oUnsupportedOperationException.

Umjava.util.List tem mais funcionalidade do que umrray comum pode suportar. Por exemplo, com apenas uma chamada de método integrada, é possível verificar se um elemento específico está dentro da estrutura. É normalmente por isso que às vezes precisamos converter umarray em umList ouCollection.

Para obter uma introdução à implementação principal do JavaList - oArrayList - consulteto this article.

2. UnsupportedOperationException

Uma forma frequente em que esse erro ocorre é quando usamos o métodoasList() dejava.util.Arrays:

public static List asList(T... a)

Retorna:

  • um tamanho fixoList a partir do tamanho de um determinadoarray

  • um elemento do mesmo tipo que o doarray original e deve ser umObject

  • elementos na mesma ordem as na matriz original

  • uma lista que éserializablee implementaRandomAccess

Como T é umvarargs, podemos passar um array ou os itens diretamente como parâmetros, e o método criará uma lista inicializada de tamanho fixo:

List flowers = Arrays.asList("Ageratum", "Allium", "Poppy", "Catmint");

Também podemos passar umarray real:

String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List flowerList = Arrays.asList(flowers);

Since the returned List is a fixed-size List, we can’t add/remove elements.

Uma tentativa de adicionar mais elementos causariaUnsupportedOperationException:

String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List flowerList = Arrays.asList(flowers);
flowerList.add("Celosia");

A raiz desseException é que o objeto retornado não implementa a operaçãoadd() , pois não é o mesmo quejava.util.ArrayList.

É umArrayList, dejava.util.Arrays.

Outra maneira de obter a mesma exceção é tentando remover um elemento da lista obtida.

Por outro lado, existem maneiras de obter umList mutável caso seja necessário.

Um deles é criar umArrayList ou qualquer tipo de lista diretamente do resultado deasList():

String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" };
List flowerList = new ArrayList<>(Arrays.asList(flowers));

3. Conclusão

Em conclusão, é importante entender que adicionar mais elementos a uma lista pode ser problemático para mais do que apenas listas imutáveis.

Como sempre, o código-fonte completo dos exemplos está disponívelover on GitHub.