2012-04-04 1 views
0

Possible en double:
Concurrent modification error when adding elements to LinkedListcomment surmonter l'erreur ConcurrentModificationException

j'ai un arraylist de chaînée

List<LinkedList<File1>> backup = new ArrayList<LinkedList<File1>>(); 

lors de l'exécution sur cliquant sur un bouton je veux supprimer quelques éléments d'une liste et les ajouter dans une autre liste. J'ai aussi essayé de déclarer la liste chaînée comme

List<LinkedList<File1>> lists = Collections.synchronizedList(new ArrayList<LinkedList<File1>>()); 

bt toujours l'erreur reste le même. Je ne suis pas en mesure de comprendre l'erreur, je suis aussi nouveau à java donc plz faire de l'aide. Mon code est le suivant.

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {           
     // When delete button is clicked 
     int parent_node = 0, d =0 ; 
     File1 srt[] ; 
     File1 deleted[] = new File1[no_node]; 
     Random randomGenerator = new Random(); 
     int rand_no = 0; 
     while(rand_no == 0) 
     { 
      rand_no = randomGenerator.nextInt(no_node); 
     } 
     System.out.println("random no : " + rand_no); 
     for(i=0;i<backup.size();i++) 
     {    
      ListIterator itr = it_bk.get(i); 
      while(itr.hasNext()) 
      { 
       File1 file = (File1) itr.next();     
       if(rand_no == file.nod) 
       {      
        parent_node = i; 
        itr.remove();      
       } 
      } 
      //iterating back 
      while(itr.hasPrevious()) 
       { 
        File1 file = (File1) itr.previous(); 
       }    
     } 

     System.out.println("Parent node:" + parent_node); 
     //add the nodes to parent 
     ListIterator itr1 = it_bk.get(rand_no); 

     System.out.println("randam node"); 

     while(itr1.hasNext()) 
     { 
      File1 file = (File1) itr1.next(); 
      deleted[d] = new File1(); 
      deleted[d] = file ; 
      d++; 
      //tmp_bk.add(file); 
      System.out.println("node :" + file.nod + "\tdist :" + file.dist); 
     } 

     LinkedList<File1> tmp_bk = backup.get(parent_node); 
     for(j=0;j<d;j++) 
     { 
      tmp_bk.add(deleted[j]); 
      System.out.println(deleted[j].nod + "\t" + deleted[j].dist); 
     } 
     //it_bk.add(tmp_bk.listIterator()); 
     ListIterator itr_p = it_bk.get(parent_node); 
     System.out.println("parent node"); 
      while(itr_p.hasNext()) 
     { 
      File1 file = (File1) itr_p.next(); 
      System.out.println("node :" + file.nod + "\tdist :" + file.dist); 
     } 

     }     
+0

vous ne pouvez pas modifier une liste en l'itérant sur elle. Penses-y. vous avez 5 objets et itérez dessus, alors vous en retirez 1. Vous rendez l'état de la liste incohérent. – zengr

Répondre

1

Vous traversant la liste et la modification de la même liste non valide,

itr.remove();  

Gérer deux listes à la place, et après itération peuvent être appliquées effet de la liste résultante à la liste des sources

+0

thnks beaucoup pour votre réponse :) mais je n'ai pas un problème en supprimant les éléments de la liste. C'est la raison pour laquelle je mets les éléments dans un tableau, puis j'essaie d'ajouter des éléments dans une autre liste. – Divyashree

+0

thnks beaucoup :) son travail nw :) – Divyashree

+0

vous êtes les bienvenus :) (également pour marquer cette réponse comme accepté), si cela a vraiment répondu à votre question –

0

L'erreur se produit lorsque vous supprimez des objets d'une liste pendant que y fait une itération. Vous pouvez mettre les éléments que vous souhaitez supprimer dans une autre liste et après l'itération sur le premier appelez simplement firstlist.removeAll(list_with_items_to_remove).

+1

Qui peut être accompli avec une copie de la liste et les méthodes removeAll (ou peut-être retainAll dans certains cas) – keyser

+0

ok si c'est le problème que j'ai supprimé. Maintenant, en ajoutant des objets à la liste liée et j'ai toujours la même erreur. – Divyashree

+0

Vous ne pouvez pas insérer d'objets dans une liste en même temps. Lorsque vous démarrez l'itération, vous devez considérer la liste verrouillée pour les insertions et les suppressions. Tout ce qui doit être fait après l'itération. Faites la même chose que dans ma réponse, mais utilisez à la place firstlist.addAll (list_with_items_to_add). Si vous avez vraiment besoin de modifier la liste pendant l'itération, vous pouvez regarder java.util.concurrent.ConcurrentLinkedQueue ou quelque chose comme ça. Mais sachez que ce n'est pas aussi rapide que d'itérer sur une liste normale. –