helpermethod
helpermethod

Reputation: 62145

Strange UnsupportedOperationException when calling list.remove(0)

I have this method which takes a varargs of Strings, creates a List out of it, and then tries to remove the first element of the list.

public void importFrom(String... files) {
    List<String> fileList = Arrays.asList(files);

    String first = fileList.remove(0);
    // other stuff
}

But as soon as remove gets called, an UnsupportedOperationException is thrown. My guess is that the return List-Type does not support the remove method. Am I correct? What alternatives do I have?

Upvotes: 1

Views: 970

Answers (5)

Prince John Wesley
Prince John Wesley

Reputation: 63688

The returned list acts as a view for the backed array. You can not modify the list directly but only through the backed array. However, you cannot resize the array.

Upvotes: 0

A.H.
A.H.

Reputation: 66213

Arrays.asList only provides a thin wrapper around an array. This wrapper allows you to do most operations on an array using the List API. A quote from the JavaDoc:

Returns a fixed-size list backed by the specified array. [...] This method acts as bridge between array-based and collection-based APIs [...]

If you really want to remove something, then this might work:

List<String> realList = new ArrayList<String>(Arrays.asList(stringArray));

This one creates a real ArrayList (which supports remove) and fills it with the contents of another list which happens to be the wrapper around your String[].

Upvotes: 7

AlexR
AlexR

Reputation: 115328

Arrays.asList() returns instance of Arrays.ArrayList that that is unmodifireable list because it is a simple wrapper over array. You cannot remove elements from array.

This is written in javadoc of asList():

Returns a fixed-size list backed by the specified array.

Upvotes: 1

Mister Smith
Mister Smith

Reputation: 28158

Arrays.asList provides a List view of the array, BACKED by the array. And arrays are not resizable. Any attempt to change its size will throw an exception.

Upvotes: 4

Vala
Vala

Reputation: 5674

You could just create a new ArrayList<String>(), then loop over all files for (String file : files) fileList.add(file);. Or you could use the List you already created and add it to the new ArrayList using fileList.addAll(files);

Upvotes: 2

Related Questions