Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec les objets d'une liste

Sujet résolu
    1 juillet 2021 à 0:17:55

    Bonjour à tous !

    Je suis en train de travailler sur un programme de gestion de membres d'un groupe, et dans ma méthode de suppression d'un membre de la liste, je rentre le nom et le prénom du membre, mais il me renvoie l'erreur comme quoi le membre n'existe pas. Or, j'ai une autre méthode qui affiche la liste complète des membres, et ce membre existe bel et bien.

    Je vous mets ici ma méthode de suppression d'un membre :

    public static void supprimerMembre() throws MembreInexistantException, IOException {
    	System.out.print("Entrez le nom du membre à supprimer : ");
    	String nom = sc.nextLine();
    	System.out.println();
    	System.out.print("Entrez le prénom du membre à supprimer : ");
    	String prenom = sc.nextLine();
    	Membres m = null;
    	for(Membres mbr : listeMembres) {
    		if(nom == mbr.getNom()) {
    			if(prenom == mbr.getPrenom()) {
    				m = mbr;
    			}
    		}
    	}
    	
    	if(m == null) {
    		logger.log(Level.WARNING,"Ce membre n'existe pas.");
    		throw new MembreInexistantException(nom+" n'est pas dans la liste des membres");
    	}
    	
    	File f = new File("./src/main/resources/Membres/"+nom+".json");
    	if(f.delete()) {
    		logger.log(Level.INFO,nom+" a été supprimé de la liste des membres");
    	} else {
    		logger.log(Level.WARNING,"Le fichier du membre n'a pas pu être supprimé.");
    		throw new IOException("Erreur lors de la suppression du fichier");
    	}
    	listeMembres.remove(m);
    }

    Quelqu'un a une idée d'où pourrait venir ce problème ? Si vous avez besoin de voir une autre partie de mon programme dites-le-moi !

    Merci d'avance pour votre aide !

    • Partager sur Facebook
    • Partager sur Twitter
      1 juillet 2021 à 9:09:45

      Hello,

      c'est parce que tu compares les noms et prénoms avec l'opérateur ==

      En Java les objets se comparent avec la méthode equals() pas avec l'opérateur == , et les String sont des objets.

      L'opérateur == sert à dire si deux variables pointent vers le même objet, ou si une variable pointe vers null. C'est pas du tout ce qui t'intéresse. Toi tu veux savoir si deux objets String différents ont un contenu équivalent. Pour ça c'est la méthode equals().

      • Partager sur Facebook
      • Partager sur Twitter
        1 juillet 2021 à 12:04:43

        Aaaah oui effectivement, j'avais oublié ça ! Merci beaucoup !

        Bon, j'ai un autre problème maintenant : il n'arrive pas à supprimer le fichier (il me renvoie l'erreur), quelqu'un saurait d'où vient le problème ? x)

        -
        Edité par EthanWright 1 juillet 2021 à 12:25:56

        • Partager sur Facebook
        • Partager sur Twitter
          1 juillet 2021 à 14:11:43

          Probablement parce que le fichier est ouvert, ou qu'il n'existe pas.

          Mais il faudrait qu'on ait le projet entier pour avoir une idée plus précise.

          • Partager sur Facebook
          • Partager sur Twitter
            1 juillet 2021 à 14:53:38

            Alors, le fichier existe bien parce que je l'ai dans mon arborescence et dans mes dossiers quand je vais vérifier :p Et je l'ai jamais ouvert, que ça soit dans mon IDE ou sur mon pc, donc je pense pas que ça soit ça :p

            Comment je pourrais vous envoyer le projet ? En sachant que c'est un projet Maven d'ailleurs

            • Partager sur Facebook
            • Partager sur Twitter
              1 juillet 2021 à 14:59:55

              Est ce possible de voir le projet en entier pour avoir plus de bonne vue?

              • Partager sur Facebook
              • Partager sur Twitter
                1 juillet 2021 à 16:13:27

                Je suis nouveau sur openclassroom, je trouve pas les bonnes pratiques recommandées pour partager un projet entier.

                Cela dit, je remarque un truc qui va pas : le fichier que tu essaies de supprimer est dans les ressources. Les ressources sont lues par le programme, ce qui veut dire qu'il les ouvre, bien sûr -_-°

                Plus important, là ton programme est un projet ouvert dans l'IDE mais à terme ce sera un fichier exécutable. Évidemment, que tu ne peux pas effacer les ressources qu'il contient, voyons.

                • Partager sur Facebook
                • Partager sur Twitter
                  1 juillet 2021 à 19:29:39

                  @Kumesana - J'ai beau mettre le dossier membre dans le dossier même du projet, ça ne change rien du tout

                  @BevelandDieu-VeilAnsi - J'envoie ça comment ? J'aimerais bien l'envoyer mais comment x)

                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 juillet 2021 à 21:05:27

                    Il te donne une erreur de suppression ou bien une MembreInexistantException ? Si c'est la première, est-ce que le nom du fichier contient juste le nom du membre et non le prénom ?

                    Tu pourrais checker l'existence du fichier du point de vue de ton programme avec un if(f.exists()) par exemple. Vu que le chemin utilisé lors de l’instanciation de File est relatif, ça peut causer des problèmes si tu n'exécutes pas le programme du bon endroit. Dans tous les cas, il est recommandé d'utiliser Files.delete() vu qu'elle lance une exception qui donnera plus de détails sur l'erreur de suppression.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      1 juillet 2021 à 21:49:54

                      @Scroph - Alors, il me donnait bien une erreur de suppression, il me renvoyait une IOException et pas MembreInexistantException :p Du coup j'ai testé avec Files.delete(), et voici l'erreur qu'il me donne :

                      java.nio.file.FileSystemException: .\src\main\resources\Membres\MEMBRE.json: Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus

                      at java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:92)

                      at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)

                      at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:108)

                      at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:274)

                      at java.base/sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:105)

                      at java.base/java.nio.file.Files.delete(Files.java:1146)

                      at fr.emarlot.Main.supprimerMembre(Main.java:119)

                      at fr.emarlot.Main.main(Main.java:150)


                      Voilà, donc il me dit effectivement que le fichier est ouvert quelque part (mea culpa @Kumesana)... Y'aurait un moyen pour le fermer ?

                      -
                      Edité par EthanWright 1 juillet 2021 à 21:50:11

                      • Partager sur Facebook
                      • Partager sur Twitter
                        2 juillet 2021 à 20:32:20

                        Tu ouvres ce fichier quelque part dans ton code ou dans un éditeur externe ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 juillet 2021 à 9:39:45

                          Normalement je l'ouvre pour charger le membre, voici ma méthode chargerMembres :

                          public static void chargerMembres() {
                          	String dirpath = "./src/main/resources/Membres/";
                          	File dir = new File(dirpath);
                          	String filename[] = dir.list();
                          	
                          	try {
                          		Jsonb jsonb = JsonbBuilder.create();
                          		FileReader fr;
                          		BufferedReader br;
                          		for(String s : filename) {
                          			fr = new FileReader(new File(dirpath + s));
                          			br = new BufferedReader(fr);
                          			
                          			Membres m = jsonb.fromJson(br.readLine(), Membres.class);
                          			listeMembres.add(m);
                          		}
                          	} catch (IOException e) {
                          		e.printStackTrace();
                          	}
                          }


                          Ça serait à cause de ça ?

                          ===

                          UPDATE :

                          J'ai changé la façon dont je sauvegarde et charge mes fichiers : je sauvegarde, en plus de chaque membre, l'ArrayList listeMembres, et je charge uniquement la liste. Je sais pas trop si c'est la méthode la plus optimisée, mais en tout cas ça marche :p Si vous avez des conseils à me donner je dis pas non x) Et sinon merci beaucoup pour votre aide !

                          -
                          Edité par EthanWright 3 juillet 2021 à 15:41:55

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Problème avec les objets d'une liste

                          × 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