# 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.