2013-09-30 1 views
0

Lorsque nous exécutons le programme ci-dessus, nous obtenons java.util.ConcurrentModificationException dès que le ArrayList est modifié. Cela arrive parce que l'itérateur ArrayList est défaillant par conception. Cela signifie qu'une fois l'itérateur créé, si le ArrayList est modifié, il lance un ConcurrentModificationException.CopyOnArrayList modification simultanée

public class ConcurrentListExample { 

    public void someMethod() { 
     List<String> list = new ArrayList<>(); 
     list.add("1"); 
     list.add("2"); 
     list.add("3"); 
     list.add("4"); 
     list.add("5"); 

     // get the iterator 
     Iterator<String> it = list.iterator(); 

     //manipulate list while iterating 
     while (it.hasNext()) { 
      String str = it.next(); 
      System.out.println(str); 
      if (str.equals("2")) { 
       list.remove("5"); 
      } 
      if (str.equals("3")) { 
       list.add("3 found"); 
      } 
      if(str.equals("4")) { 
       list.set(1, "4"); 
      } 
     } 
    } 
} 

mais si nous prenons Employee classe:

public class Test { 
    public static void main(String[] args) { 
     List al = new ArrayList(); 
     Employee ee = new Employee(1, "anoj"); 
     Employee ee1 = new Employee(2, "hai"); 
     al.add(ee); 
     al.add(ee1); 
     Iterator it = al.iterator(); 
     while (it.hasNext()) { 
      Employee hh = (Employee)it.next(); 
      if (hh.getName().equals("anoj")) { 
       al.remove(0); 
       System.out.println(al); 
      } 
     } 
    } 
} 

Je n'ai pas eu ConcurrentModificationException.

+0

Son correct « Vous devez ajouter ou supprimer un objet tout en réitérant. – Sarma

+0

Pouvez-vous s'il vous plaît fixer le formatage? Il est difficile de voir ce qui se passe dans ce code. Dans le premier bloc, s'il vous plaît diminuer le niveau de retrait de façon à Dans le deuxième bloc, veuillez ajouter l'indentation appropriée, afin que les gens puissent lire votre question plus facilement et donner une réponse – yshavit

+3

Quelle est la véritable question ici –

Répondre

2

Vous ne pouvez pas modifier et imprimer des opérations simultanément à l'aide de l'itérateur. il soutenir add() et remove().

0

Vous devez ajouter ou supprimer via l'itérateur.

+1

. enlever() j'ai java.lang.IllegalStateException – user2832497

1

Il n'échoue pas la deuxième fois car le iterator renvoie anoj en dernier. Donc hasNext renvoie false et next n'est jamais appelé, donc pas ConcurrentModificationException.

Il suffit de déplacer l'ajout de ee1 ci-dessus ee et il échouera

Remarque Ceci est la mise en œuvre interne ArrayList à 1. Pourquoi Anoj est retourné dernier et 2. Pourquoi hasNext ne marche pas lancer CME.

+0

Merci bon exaplain – user2832497

1

La vérification du gaz d'exception de modification simultanée est une faille qui, si vous supprimez le second dernier élément d'une ArrayList, ne se plaindra pas mais ignorera la dernière entrée. Cela se produit car il vérifie s'il a itéré fois() fois avant de vérifier la modification simultanée.

+0

Merci Très utile – user2832497

0

Je pense que l'explication correcte est cet extrait de e javadocs of ConcurrentModificationExcetion:

Notez que le comportement fail-rapide ne peut pas être garanti car il est, en général parler, impossible de faire des garanties difficiles en présence de modification simultanée non synchronisée. Les opérations Fail-fast lancent ConcurrentModificationException au mieux. Par conséquent, il aurait tort d'écrire un programme qui dépendait de cette exception pour son exactitude: ConcurrentModificationException doit être utilisé seulement pour détecter les bogues.

+0

ok pouvez-vous fournir le lien – user2832497

+0

oui j'ai mis à jour la réponse avec le lien.Désolé je devrais l'avoir fait avant. – Sage

Questions connexes