IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Exception "UnsupportedOperationException" lors d'une suppression


Sujet :

JavaFX

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 76
    Points : 49
    Points
    49
    Par défaut Exception "UnsupportedOperationException" lors d'une suppression
    Bonjour j'essaye actuellement d'améliorer mon code, et en me relisant j'ai vu que je faisait un truc plutôt bizarre (mais qui me provoquait pas d’exception !)

    Ma situation est la suivante j'ai une listView contenant 4 cartes, lorsque le joueur choisie une carte cette dernière et supprimée de la liste et ainsi de suite jusqu’à qu'il n'y est plus de carte et que nouvelle fenêtre s'ouvre.
    En conséquent j'ai décider de mettre en place un "addListener" sur la liste view du nom de listDeCarte...
    La méthode tour et celle qui supprime une carte de la liste et c'est au moment de cette suppression que l'erreur survient ...

    Voici le code afin que vous voyer mieux la situation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
     
            listDeCarte.getSelectionModel().selectedItemProperty().addListener((__, ov, nv) -> {
                if (nv != null) {
                    Object objetSelectionne = listDeCarte.getSelectionModel().getSelectedItem();
                    while(objetSelectionne==null){
                        objetSelectionne = listDeCarte.getSelectionModel().getSelectedItem();
                    }
                    carteJoueur=  (Carte) objetSelectionne;
                    carteAdversaire = manageur.choixCarteAdverse(listCarteAdverse);
                    try {
                        resultatTour = manche.tour(carteAdversaire, carteJoueur);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    afficherResultatTour(resultatTour, carteJoueur, carteAdversaire);
                    if(listCarteAdverse.size()==0 && listCarteJoueur.size()==0){
                        affichageFinDePartie(manche);
                        Stage stageTableauDesScores = new Stage();
                        FXMLLoader leLoader = new FXMLLoader(getClass().getResource("/fxml/TableauDesScores.fxml"));
                        leLoader.setController(new TableauDesScores(manageur, joueur));
                        Parent root = null;
                        try {
                            root = leLoader.load();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        Scene scene = new Scene(root);
                        scene.getStylesheets().add(getClass().getResource("/css/application.css").toExternalForm());
                        stageTableauDesScores.setScene(scene);
                        stageTableauDesScores.setTitle("Tarot Africain");
                        closeStage(controler);
                        stageTableauDesScores.show();
                    }
                }
            });

    la méthode tour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
        /**
         * Méthode qui permet de définir quel joueur est le vainqueur du tour,
         * Cette méthode permet aussi de supprimer la carte jouer par le joueur et le joueur adverse.
         * @param carteAdverse carte jouer par le joueur adverse
         * @param carteJoueur carte jouer par le joueur
         * @return false si le joueur à perdu le tour sinon retourne vrai
         * @throws Exception le programme n'est sensé jamais arriver ici, signifie que les cartes jouer par le joueur
         * et le jouer adverse sont identiques.
         */
        public boolean tour(Carte carteAdverse, Carte carteJoueur) throws Exception {
            if (carteAdverse.getValeur() > carteJoueur.getValeur()) {
                setNbPartieGagneeAdverse(getNbPartieGagneeAdverse() + 1);
                carteListAdverse.remove(carteAdverse);
                carteListJoueurObs.remove(carteJoueur);   //PROVOQUE L'ERREUR
                return false;
            } else {
                if(carteJoueur.getValeur() > carteAdverse.getValeur()) {
                    setNbPartieGagneeJoueur(getNbPartieGagneeJoueur() + 1);
                    carteListAdverse.remove(carteAdverse);
                    carteListJoueurObs.remove(carteJoueur);  //PROVOQUE L'ERREUR
                    return true;
                }
                else{
                    throw new Exception("Problème, la carte jouer par le joueur et le joueur adverse et la même");
                }
            }
        }


    J'ai fait des recherches est j'ai vu que c'est un problème ce produit souvent est il est conseiller d'utiliser "Arrays.asList(split)" mais je ne voit pas ou utilisé dans mon code. De plus j'aimerais comprendre pourquoi cette erreur "survient" maintenant et pas avant quand je passait par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onMouseClicked="#carteChoix"
    .

    Voici comment est crée ma carteListJoueurObs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        /**
         * Liste de carte observable des carte du joueur
         */
        private final ObservableList<Carte> carteListJoueurObs = FXCollections.observableArrayList();
        private final ListProperty<Carte> carteListJoueur = new SimpleListProperty<>(carteListJoueurObs);
        /**
         * Ces différentes méthodes permet de modifiée la liste de joueur ou bien de la retournée.
         */
            public ObservableList<Carte> getCarteListJoueur() {return carteListJoueur.get();}
            public ListProperty<Carte> carteListJoueurProperty() {return carteListJoueur;}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
        /**
         * Méthode qui permet de distribuer les cartes au deux joueurs
         * Cette méthode appelle la méthode "doRandom" de la classe "Jeu"
         * Elle récupére la liste de carte de "doRandom" puis la sépare en deux ( la liste de carte du joueur
         * et la liste de carte du joueur adverse).
         * @param nb_carte représente le nombre qu'a chaque joueur dans sa main
         * @param nbJoueur représente le nombre de personne qui joue
         */
        protected void distribuer(int nb_carte, int nbJoueur) {
            List<Carte> listCarte;
            Jeu jeu = new Jeu();
            int i = 0;
            listCarte = jeu.doRandom(nb_carte, nbJoueur);
            Iterator<Carte> it = listCarte.iterator();
            while (it.hasNext()) {
                if (i < nb_carte)
                    carteListJoueurObs.add(it.next());
                else
                    carteListAdverse.add(it.next());
                i = i + 1;
            }
        }

    Merci d'avance pour vos réponses.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Quelle est la ligne qui plante exactement ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Problème, la carte jouer par le joueur et le joueur adverse et la même"
    OrthographeGrammaireFatalError!
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 76
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par bouye Voir le message
    Quelle est la ligne qui plante exactement ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Problème, la carte jouer par le joueur et le joueur adverse et la même"
    OrthographeGrammaireFatalError!

    C'est dans la fonction "tour" à la ligne15 et 20 c'est-à-dire celle-ci :"carteListJoueurObs.remove(carteJoueur); //PROVOQUE L'ERREUR"

  4. #4
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ta méthode tour() semble être invoquée dans le corps d'un événement faisant suite a une modification de la sélection de la liste. Donc clairement tu ne dois pas modifier le contenu de la liste a ce moment-la.

    Revoie la logique de ton programme et gère la logique de ton jeu "plus tard".
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2018
    Messages : 76
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par bouye Voir le message
    Ta méthode tour() semble être invoquée dans le corps d'un événement faisant suite a une modification de la sélection de la liste. Donc clairement tu ne dois pas modifier le contenu de la liste a ce moment-la.

    Revoie la logique de ton programme et gère la logique de ton jeu "plus tard".
    Bonjour, c'est bon j'ai compris la raison de mon erreur, pour ceux que ça intéresse voici la réponse : cause j'invoque ma méthode je supprime une première fois la carte sauf que à cause du faite que ma liste view et sur écoute, cette méthode est invoqué une deuxième fois (sauf que bien-sûr l'élément n'existe plus ) d'où l’erreur =)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Message d'erreur inattendue lors d'une suppression
    Par Just-Soft dans le forum Bases de données
    Réponses: 8
    Dernier message: 18/11/2008, 11h42
  2. Réponses: 3
    Dernier message: 13/04/2008, 02h40
  3. [JDOM] Problème d'iterateur lors d'une suppression
    Par romuluslepunk dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 07/01/2006, 15h00
  4. Probleme lors d'une suppression
    Par DrTank dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/04/2005, 17h38
  5. Combler les trous lors d'une suppression dans une table
    Par Billybongjoe dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 08/04/2004, 14h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo