返回

concurrentmodificationexception:ArrayList的remove(object)方法抛异常?该怎么办?

见解分享

抛出异常的原因

在使用ArrayList时,如果在遍历ArrayList的同时对其进行修改(例如,添加或删除元素),就会抛出java.util.ConcurrentModificationException异常。这是因为ArrayList使用迭代器模式来遍历其元素。当你在遍历ArrayList时,实际上是在使用迭代器来访问其中的元素。如果在遍历过程中对ArrayList进行修改,就会使迭代器失效,从而导致异常的抛出。

避免异常的方法

为了避免在ArrayList上执行remove(object)方法时抛出异常,你可以采取以下措施:

  • 使用foreach循环或迭代器来遍历ArrayList。
  • 在遍历ArrayList的同时,不要对其进行修改。
  • 在并发环境中,可以使用Collections.synchronizedList()方法来创建一个线程安全的ArrayList。

使用foreach循环或迭代器遍历ArrayList

foreach循环和迭代器都是遍历ArrayList的推荐方法。这两者都能够确保在遍历ArrayList时不会对它进行修改。

  • foreach循环 :foreach循环是Java 1.5之后引入的,它使用更简洁的语法来遍历Collection。例如,以下代码使用foreach循环遍历ArrayList:
List<String> names = new ArrayList<>();
names.add("John");
names.add("Mary");
names.add("Bob");

for (String name : names) {
  System.out.println(name);
}
  • 迭代器 :迭代器是Java Collections Framework中用于遍历Collection的标准方式。例如,以下代码使用迭代器遍历ArrayList:
List<String> names = new ArrayList<>();
names.add("John");
names.add("Mary");
names.add("Bob");

Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
  String name = iterator.next();
  System.out.println(name);
}

在遍历ArrayList的同时,不要对其进行修改

如果你需要在遍历ArrayList的同时对其进行修改,那么你必须使用正确的同步机制来确保线程安全。否则,你可能会在ArrayList上执行remove(object)方法时抛出java.util.ConcurrentModificationException异常。

在并发环境中,可以使用Collections.synchronizedList()方法来创建一个线程安全的ArrayList

如果你的ArrayList将在并发环境中使用,那么你应该使用Collections.synchronizedList()方法来创建一个线程安全的ArrayList。例如,以下代码创建一个线程安全的ArrayList:

List<String> names = Collections.synchronizedList(new ArrayList<>());
names.add("John");
names.add("Mary");
names.add("Bob");

结论

总之,在ArrayList上执行remove(object)方法时抛出java.util.ConcurrentModificationException异常,是因为在遍历ArrayList的同时对其进行了修改。为了避免异常的抛出,你可以使用foreach循环或迭代器来遍历ArrayList,或者使用Collections.synchronizedList()方法来创建一个线程安全的ArrayList。