2

我有一个将数据添加到列表的代码。我不明白为什么UnsupportedOperationException在一种情况下和 ConcurrentModificationException另一种情况下都会抛出。在这两种情况下,我都在列表中添加数据,然后在迭代列表时尝试删除列表数据。到目前为止,我所读到的是,每当对故障快速收集进行任何修改时,都会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

4

2 回答 2

1

对于您获得的代码块,您会ConcurrentModificationException得到该异常,因为您创建了一个迭代器,List然后直接从循环内的列表中删除,因此迭代器有问题。您应该使用remove()迭代器本身的方法 - Iterator.remove()

从外部迭代器循环中删除时,您应该直接从列表中删除一个元素。看到这个另一个SO问题

在第二种情况下,使用Arrays.asList,您会得到一个List但实际的列表对象可能不是一个ArrayList 并且remove(int index)操作在List接口处是可选的。看到这个

总而言之,就UnsupportedOperationException第一种情况而言,您可以保证使用一个ArrayList并且对于该类,支持删除操作,请参阅此

对于第二种情况,你不能这么确定。请参阅文档Arrays.asList说明返回的固定大小列表,因此不支持某些操作。

于 2017-05-01T05:33:33.447 回答
0

Arrays.asList 不返回 ArrayList。实际上,返回的列表是不可修改的,因此当您尝试修改它时,它会抛出 UnsupportedOperationException。

于 2017-05-01T05:16:18.660 回答