UnsupportedOperationException 与 ConcurrentModificationExcetion
UnsupportedOperationException vs ConcurrentModificationExcetion
我有一个代码可以将数据添加到列表中。我不明白的是为什么
UnsupportedOperationException
在一种情况下被抛出并且
ConcurrentModificationException
在另一个。
在这两种情况下,我都在列表中添加数据,然后尝试删除列表
遍历列表时的数据。
到目前为止我所读到的是,每当对
fail-fast collection,ConcurrentModificationException
被抛出。那么为什么这个
在这两种情况下有不同的行为?
List<String> animalList = new ArrayList<>();
animalList.add("cat");
animalList.add("dog");
animalList.add("bear");
animalList.add("lion");
Iterator<String> iter = animalList.iterator();
while(iter.hasNext()){
String animal = iter.next();
System.out.println(animal);
animalList.remove(3);
}
此代码抛出 ConcurrentModificationException
String[] strings = { "Java", "Honk", "Test" };
List<String> list = Arrays.asList(strings);
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String name = iterator.next();
System.out.println(name);
list.remove(3);
}
而这个抛出 UnsupportedOperationException
Arrays.asList 不是 return ArrayList。事实上,列表 returned 是不可修改的,因此当您尝试修改它时,它会抛出 UnsupportedOperationException。
对于获得 ConcurrentModificationException
的代码块,您会得到该异常,因为您在 List
上创建了一个迭代器,然后直接从循环内的列表中删除,因此迭代器有问题。您应该使用迭代器本身的 remove()
方法 - Iterator.remove()。
从外部迭代器循环中删除元素时,应直接从列表中删除元素。 See this another SO Question
在第二种情况下,使用 Arrays.asList
,您会得到一个 List
但实际列表对象可能不是 ArrayList
并且 remove(int index)
操作在 [=11 处是可选的=] 界面。 See this
总而言之,就 UnsupportedOperationException
而言,在第一种情况下,您可以保证使用 ArrayList
,对于 class,支持删除操作,See this
对于第二种情况,你不能那么肯定。 Arrays.asList
的 Refer documentation 表示返回的列表大小固定,因此不支持某些操作。
我有一个代码可以将数据添加到列表中。我不明白的是为什么
UnsupportedOperationException
在一种情况下被抛出并且
ConcurrentModificationException
在另一个。
在这两种情况下,我都在列表中添加数据,然后尝试删除列表
遍历列表时的数据。
到目前为止我所读到的是,每当对
fail-fast collection,ConcurrentModificationException
被抛出。那么为什么这个
在这两种情况下有不同的行为?
List<String> animalList = new ArrayList<>();
animalList.add("cat");
animalList.add("dog");
animalList.add("bear");
animalList.add("lion");
Iterator<String> iter = animalList.iterator();
while(iter.hasNext()){
String animal = iter.next();
System.out.println(animal);
animalList.remove(3);
}
此代码抛出 ConcurrentModificationException
String[] strings = { "Java", "Honk", "Test" };
List<String> list = Arrays.asList(strings);
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String name = iterator.next();
System.out.println(name);
list.remove(3);
}
而这个抛出 UnsupportedOperationException
Arrays.asList 不是 return ArrayList。事实上,列表 returned 是不可修改的,因此当您尝试修改它时,它会抛出 UnsupportedOperationException。
对于获得 ConcurrentModificationException
的代码块,您会得到该异常,因为您在 List
上创建了一个迭代器,然后直接从循环内的列表中删除,因此迭代器有问题。您应该使用迭代器本身的 remove()
方法 - Iterator.remove()。
从外部迭代器循环中删除元素时,应直接从列表中删除元素。 See this another SO Question
在第二种情况下,使用 Arrays.asList
,您会得到一个 List
但实际列表对象可能不是 ArrayList
并且 remove(int index)
操作在 [=11 处是可选的=] 界面。 See this
总而言之,就 UnsupportedOperationException
而言,在第一种情况下,您可以保证使用 ArrayList
,对于 class,支持删除操作,See this
对于第二种情况,你不能那么肯定。 Arrays.asList
的 Refer documentation 表示返回的列表大小固定,因此不支持某些操作。