Java gotcha: UnsupportedOperationException removing element from list while iterating 

Joined:
04/09/2007
Posts:
753

July 27, 2011 08:55:34    Last update: July 27, 2011 08:55:34
It is OK to remove elements from a list with Iterator, but you get UnsupportedOperationException if the list is created with Arrays.asList:
import java.util.*;

public class IteratorRemoveTest {
    public static void main(String[] args) {
	arrayListTest();
	arrayAsListTest();
    }

    static void arrayListTest() {
	System.out.println("ArrayList test:\n================");
	List<String> list1 = new ArrayList<String>();
	list1.add("one");
	list1.add("two");
	list1.add("three");
	removeTwo(list1);
	System.out.println("List size: " +  list1.size());
	System.out.println();
    }

    static void arrayAsListTest() {
	System.out.println("Array as List test:\n================");
	List<String> list2 = Arrays.asList("one", "two", "three");
	removeTwo(list2);
	System.out.println("List size: " +  list2.size());
	System.out.println();
    }

    static void removeTwo(List<String> list) {
	try {
	    Iterator<String> it = list.iterator();
	    while (it.hasNext()) {
		if ("two".equals(it.next())) {
		    it.remove();
		}
	    }
	}
	catch (UnsupportedOperationException e) {
	    e.printStackTrace();
	}
    }
}

Prints:
ArrayList test:
================
List size: 2

Array as List test:
================
java.lang.UnsupportedOperationException
	at java.util.AbstractList.remove(AbstractList.java:144)
	at java.util.AbstractList$Itr.remove(AbstractList.java:360)
	at IteratorRemoveTest.removeTwo(IteratorRemoveTest.java:33)
	at IteratorRemoveTest.arrayAsListTest(IteratorRemoveTest.java:23)
	at IteratorRemoveTest.main(IteratorRemoveTest.java:6)
List size: 3

Share |
| Comment  | Tags