Java gotcha: UnsupportedOperationException removing element from list while iterating
July 27, 2011 08:55:34 Last update: July 27, 2011 08:55:34
It is OK to remove elements from a list with
Prints:
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