Partage
  • Partager sur Facebook
  • Partager sur Twitter

java.util.ConcurrentModificationException

Sujet résolu
    21 janvier 2018 à 16:06:07

    Bonjour à tous, 

    J'ai un problème depuis plusieurs jours qui est le suivant: j'ai une exception JAVA qui m'empêche de supprimer un id. J'ai lu sur d'autres forums que c'est à cause des deux for. En effet on parcourt pendant qu'on supprime. 

    Mais je vois pas comment je peux modifier.

    Voici le code en question:

    private void DeleteTask(String idString) {
    		int id = Integer.parseInt(idString);
    
    		for (Project project : TaskListApplication.getInstance().getProjects()) {
    			for (Task task : project.getTache()) {
    				if(task.getId()==id) {
    					project.getTache().remove(task);
    				}
    			}       
    
    		}
    
    	}

    Merci d'avance :)

    • Partager sur Facebook
    • Partager sur Twitter
      21 janvier 2018 à 18:10:17

      Bonjour,

      c'est une erreur très courante ;), mais le problème ne vient pas des 2 for, tu aurais le même problème avec 1 seul (celui dans lequel tu fais le remove)

      Tu peux régler cela de plusieurs façons.

      La plus simple est de remplacer ton parcours de liste de tâches  avec un sur iterable, par une boucle directement sur iterateur

      Iterator<Task> iter = project.getTache().iterator();
      while (iter.hasNext()) {
      	Task task = iter.next();
      	if(task.getId()==id) {
      		iter.remove();
      	}
      }

      ensuite, tu peux exploiter les Streams et lambdas de Java 8 qui donne:

      project.getTache().removeIf(task -> task.getId()==id);

      C'est plus cool comme code, non ?


      • Partager sur Facebook
      • Partager sur Twitter
        21 janvier 2018 à 18:15:09

        Salut, 

        Je te remercie pour ces 2 solutions, mais  je ne comprends plus pourquoi il y a cette exception de JAVA. En effet j'ai réalisé d'autres méthodes comme ajout et je n'ai pas eu ce soucis ... 

        Je vais tester  ces 2 solutions de suite :)

        • Partager sur Facebook
        • Partager sur Twitter
          21 janvier 2018 à 18:16:11

          Salut,

          Le problème vient du fait que tu veuilles supprimer un élément de la liste que tu es en train de lire (je te redis la même chose que tu as trouvé, je sais x) ). Pour contrer ça, c'est pas compliqué, il faut juste que tu fasses une bonne vielle boucle for, et pas une forEach comme tu le fais actuellement.

          private void DeleteTask(String idString) {
                  int id = Integer.parseInt(idString);
           
                  for (Project project : TaskListApplication.getInstance().getProjects()) {
                      for (int i = 0 ; i < project.getTache().size() ; i++) {
                          if(project.getTache().get(i).getId()==id) {
                              project.getTache().remove(task);
                              break;
                          }
                      }      
                  }
              }

          Je pense que comme ça, ça fonctionne.

          En espérant t'avoir aidé :)

          -
          Edité par Mathiouza 21 janvier 2018 à 18:17:26

          • Partager sur Facebook
          • Partager sur Twitter
          Apprenez, codez, dessinez, réfléchissez, ... L'important c'est d'aimer ce que l'on fait.
            21 janvier 2018 à 18:21:43

            Merci Mathiouza pour ta réponse mais l'initialisation de la tache dans le if a disparu ... Du coup on l'initialise avant les deux for ?

            Mais @JDesm, j'ai perdu l'instance que j'ai réalisé en regardant vos 2 solutions. Cela a t-il un impact si l'instance n'est pas présente ?

            • Partager sur Facebook
            • Partager sur Twitter
              21 janvier 2018 à 18:26:11

              Ta tâche est déjà initialisée dans ton objet Project. Il te suffit donc seulement de récupérer celle-ci avec les fonctions que tu as programmé dans ta classe Project. De plus, tu n'as pas besoin d'avoir, dans une variable à côté, ta tâche, puisque tu veux la supprimer.
              • Partager sur Facebook
              • Partager sur Twitter
              Apprenez, codez, dessinez, réfléchissez, ... L'important c'est d'aimer ce que l'on fait.
                21 janvier 2018 à 18:33:14

                Je ne comprends pas ça ne fonctionne pas quand je mets task dans le remove ...
                • Partager sur Facebook
                • Partager sur Twitter
                  21 janvier 2018 à 18:35:09

                  Ah oui pardon, tu dois mettre i à la place de task, pour dire à ton ArrayList de supprimer ton objet au rang i, puisque tu n'as pas l'objet task. Désolé.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Apprenez, codez, dessinez, réfléchissez, ... L'important c'est d'aimer ce que l'on fait.
                    21 janvier 2018 à 18:37:16

                    Merci beaucoup ça fonctionne ^^
                    • Partager sur Facebook
                    • Partager sur Twitter

                    java.util.ConcurrentModificationException

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown