1. Overview
In this quick tutorial, we’ll discuss a common Exception that can occur when working with some the API of most List implementations – the UnsupportedOperationException.
A java.util.List has more functionality than an ordinary array can support. For instance, with only one built-in method call, it’s possible to check if a specific element is inside the structure. That’s typically why we sometimes need to convert an array to a List or Collection.
For an introduction to the core Java List implementation – the ArrayList – please refer to this article.
2. UnsupportedOperationException
A frequent way in which this error occurs is when we use asList() method from java.util.Arrays:
public static List asList(T... a)
It returns:
- a fixed-size List as of size of a given array
- an element of the same type as the one in the original array and it must be an Object
- elements in the same order as in original array
- a list that is serializable and implements RandomAccess
Since T is a varargs, we can pass an array or the items directly as parameters, and the method will create a fixed-size initialized list:
List<String> flowers = Arrays.asList("Ageratum", "Allium", "Poppy", "Catmint");
We can also pass an actual array:
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" }; List<String> flowerList = Arrays.asList(flowers);
Since the returned List is a fixed-size List, we can’t add/remove elements.
An attempt to add more elements would cause UnsupportedOperationException:
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" }; List<String> flowerList = Arrays.asList(flowers); flowerList.add("Celosia");
The root of this Exception is that the returned object doesn’t implement the add() operation since it isn’t the same as java.util.ArrayList.
It’s an ArrayList, from java.util.Arrays.
Another way to obtain the same exception is by trying to remove an element from the obtained list.
On the other hand, there are ways to obtain a mutable List in case we need it.
One of them is to create an ArrayList or any kind of list directly from the result of asList():
String[] flowers = { "Ageratum", "Allium", "Poppy", "Catmint" }; List<String> flowerList = new ArrayList<>(Arrays.asList(flowers));
3. Conclusion
In conclusion, it’s important to understand that adding more elements to a list can be problematic for more than just immutable lists.
As always, the full source code of the examples is available over on GitHub.