2015-05-03 2 views
0

Я понимаю, что список массивов вызывает исключение параллельной модификации при попытке выполнить (добавить/удалить) в списке, итерации по списку.Странно не исключение одновременной модификации. Зачем?

Например, следующий метод должен вызывать Concurrent Modification Exception, когда я пытаюсь удалить элемент, итерации.

public static void testMe() { 
    inputList = new ArrayList<String>(); 
    inputList.add("1"); 
    inputList.add("2"); 
    inputList.add("3"); 

// Try comment the above insertion and uncomment this and run 
// for (int i = 0; i < 5; i++) { 
//  inputList.add(""+i); 
// } 

    System.out.println("List Size:" + inputList.size()); 
    Iterator<String> iterator = inputList.iterator(); 
    while (iterator.hasNext()) { 
     String value = (String) iterator.next(); 
     if (value.equals("2")) { 
      inputList.remove(value); 
      System.out.println("remvoing 2"); 
     } 
    } 
    System.out.println("List Size:" + inputList.size()); 
} 

Странно, я не получаю один. Но если я вставляю элементы, используя цикл for, генерируется исключение. Интересно, почему это не происходит раньше?

+0

Извините. !! Это действительно дублирующий вопрос. Мне следовало бы заглянуть за рамки того, что было предложено переполнением стека при написании этого вопроса. http://stackoverflow.com/questions/29723458/why-doesnt-this-code-throw-a-concurrentmodificationexception. – SaravMani

ответ

0

я неправильно вопрос, когда я написал свой оригинальный обслуживаемый ответ, но не могу удалить это, так как это принято, так что я буду редактировать этот резюмировать другой принятый ответ здесь: https://stackoverflow.com/a/29723542/1630906

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

Таким образом, поскольку ConcurrentModificationExceptions выдаются, когда вызов next() обнаруживает, что была произведена модификация, этот сценарий позволяет избежать такого исключения.

Так же, как Аскер сам отметил в комментариях:

Если список имел 4 элемента, и если вы пытаетесь удалить элемент во второй итерации, то вы получите одновременное изменение.

+0

В дополнение к @ekuusela ответ, мой коллега ясно объяснил проблему в моем примере. Как правило, одновременные изменения будут обнаружены только во время вызова next(). В моем примере список имел 3 элемента, а во время второй итерации элемент был удален, а затем hasNext() вернет false, который выйдет из цикла while (next() не вызывается). Если в списке было 4 элемента, и если вы попытаетесь удалить элемент во второй итерации, вы получите одновременную модификацию. – SaravMani

Смежные вопросы