Анализатор обнаружил, что коллекция, не предназначенная для параллельного изменения, модифицируется во время итерации по ней. Это может привести к возникновению исключения '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; } }
Данная диагностика классифицируется как:
|
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V6053. |