2015-07-27 2 views
1

Я изучаю структуру коллекции Java. Я написал эту небольшую программу, чтобы проверить, почему мы не можем использовать For-each для удаления элементов.java.util.ConcurrentModificationException при удалении элементов из коллекции

Код:

import java.util.ArrayList; 

class intro{ 
    public static void main(String args[]){ 
     ArrayList<String> names = new ArrayList<String>(); 
     names.add("Rajat"); 
     names.add("Saxena"); 

     for(String name:names){ 
      names.remove(name); 
     } 

     for(String name:names){ 
      System.out.println(name); 
     } 
    } 
} 

Выходы:

Saxena 

И

import java.util.ArrayList; 

class intro{ 
    public static void main(String args[]){ 
     ArrayList<String> names = new ArrayList<String>(); 
     names.add("Rajat"); 
     names.add("Saxena"); 
     names.add("Arvind"); 

     for(String name:names){ 
      names.remove(name); 
     } 

     for(String name:names){ 
      System.out.println(name); 
     } 
    } 
} 

Броски:

Exception in thread "main" java.util.ConcurrentModificationException 
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859) 
    at java.util.ArrayList$Itr.next(ArrayList.java:831) 
    at intro.main(intro.java:15) 

Почему просто добавление еще одного элемента в коллекцию вызывает ошибку?

ответ

2

Обычно, когда вы удаляете элемент из коллекции во время цикла по коллекции, вы получите ConcurrentModificationException. Частично, почему интерфейс Iterator имеет метод remove(). Использование итератора является единственным безопасным способом изменения коллекции элементов при их перемещении. Код будет выглядеть примерно так:

ArrayList<String> names = new ArrayList<String>(); 
    names.add("Rajat"); 
    names.add("Saxena"); 
    names.add("Arvind"); 
for (Iterator<String> iterator = name.iterator(); iterator.hasNext();) { 
      String string = iterator.next(); 
      if (string.isEmpty()) { 
       iterator.remove(); 
} 
} 
Смежные вопросы