>
>
>
V6053. Collection is modified while ite…


V6053. Collection is modified while iteration is in progress. ConcurrentModificationException may occur.

Анализатор обнаружил, что коллекция, не предназначенная для параллельного изменения, модифицируется во время итерации по ней. Это может привести к возникновению исключения 'ConcurrentModificationException'.

Рассмотрим несколько примеров кода с ошибкой.

Пример 1:

List<Integer> mylist = new ArrayList<>();
....
for (Integer i : mylist)
{
  if (cond)
  {
    mylist.add(i * 2); 
  }
}

Пример 2:

List<Integer> myList = new ArrayList<>();
....
Iterator iter = myList.iterator();
while (iter.hasNext())
{
  if (cond)
  {
    Integer i = (Integer) iter.next();
    myList.add(i * 2);
  }
}

Пример 3:

Set<Integer> mySet = new HashSet<>();
....
mySet.stream().forEach(i -> mySet.add(i * 2));

При этом, анализатор не будет выдавать предупреждение если коллекция позволяет параллельное изменение:

List<Integer> mylist = new CopyOnWriteArrayList<>();
....
for (Integer i : mylist)
{
  if (cond)
  {
    mylist.add(i + 1);
  }
}

Кроме того, предупреждение не будет выдано если сразу после модификации осуществляется выход из цикла:

List<Integer> mylist = new ArrayList<>();
....
for (Integer i : mylist)
{
  if (cond)
  {
    mylist.add(i + 1);
    break;
  }
}

Данная диагностика классифицируется как:

  • CERT-MSC06-J

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V6053.