LAJ1 projet phase 2 Gestion d'erreur

Voir le sujet précédent Voir le sujet suivant Aller en bas

resolu LAJ1 projet phase 2 Gestion d'erreur

Message  karemkadidola le Sam 10 Avr 2010, 09:19

Bonjour,
dans le projet, pour éviter que le jeu ne se termine dans le "main" suite à une exception du type CoupInvalideException ou IllegalArgumentException, j'ai fait un try-catch-catch dans la méthode jouerUnCoup (List<Position> positions) de la classe Jeu. et trouvé un moyen d'obtenir une nouvelle liste de position de la part du joueurConsole afin qu'il rejoue son coup. jusque là tout va bien. le gros souci c'est que s'il rejoue une deuxième fois de suite un coup qui lance une de deux exceptions là le jeu se termine (normal puisque cette fois ci l'exception est lancé dans le catch et non plus dans le try) Là où je sollicite l'aide des connaisseurs, c'est comment rester dans la boucle "catch" tant que la méthode "jouerUnCoup (List<Position>positions) lance soit un CoupInvalideException soit IllegalArgumentException afin de finir par jouer correctement le coup (après un coup Valide) et permettrer au "main" de continuer normalement l'exécution des instructions restantes.

merci de votre aide
P.S j'ai vraiment essayé plusieurs façon que je ne cite pas ici mais sans trop de succès....


Dernière édition par karemkadidola le Dim 11 Avr 2010, 18:00, édité 3 fois

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  Wark le Sam 10 Avr 2010, 12:35

Code:

while ! EstValide(coup){
  //demander coup
}
Try{
      JouerCoup
  } Catch (Exception ex) {
 //      bla bla exception..
  }

Non ?

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  DjMan42 le Sam 10 Avr 2010, 15:12

Sachant que les 2 méthodes estValide() ne doivent lancé une exception à part renvoyé vrai ou faux. La meilleure solution, serai de tester dans le main que la liste de positions que le joueur entre est correcte grâce aux 2 méthodes (estValide() de déplacementPion && estValide() de TestPrisePion). Si oui, on continue sinon, on redemande une autre liste de positions. Dans ce cas aucun objet ne devrai être modifié par une liste de positions invalide.

DjMan42

Nombre de messages : 219
Prénom : Eden
Statut : Etudiant 1er Indu
Localisation : Bruxelles
Date d'inscription : 28/10/2008

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  mba le Sam 10 Avr 2010, 23:18

Si je me souviens bien,
la visibilité de la méthode estValide est "package", ce qui ne permet pas de l'utiliser en dehors du package gxxxxx.dames et donc dans le package gxxxxx.dames.console.

Il faut alors vous contenter des méthodes publiques du jeu et gérer les exceptions.

mba

Nombre de messages : 1493
Statut : prof
Localisation : Lessines
Date d'inscription : 07/10/2006

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  karemkadidola le Sam 10 Avr 2010, 23:51

Wark a écrit:
Code:

while ! EstValide(coup){
  //demander coup
}
Try{
      JouerCoup
  } Catch (Exception ex) {
 //      bla bla exception..
  }

Non ?

merci pour ton idée mais je ne vois pas comment elle résoudrait mon problème si l'exception est lancée au sein du bloc catch...j'ai essayé par contre de mettre dans un troisième bloc "finally" un boléen pour me faire retourner dans la boucle...c'est étonnant que même ça, ne marche pas!!!!

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  mba le Sam 10 Avr 2010, 23:56

remarque : une clause finally est toujours exécutée (qu'il y ait eu exception ou pas).

L'idée du booléen peut fonctionner, mais pourquoi pas plutôt dans le catch ?

mba

Nombre de messages : 1493
Statut : prof
Localisation : Lessines
Date d'inscription : 07/10/2006

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  karemkadidola le Dim 11 Avr 2010, 00:20

DjMan42 a écrit:Sachant que les 2 méthodes estValide() ne doivent lancé une exception à part renvoyé vrai ou faux. La meilleure solution, serai de tester dans le main que la liste de positions que le joueur entre est correcte grâce aux 2 méthodes (estValide() de déplacementPion && estValide() de TestPrisePion). Si oui, on continue sinon, on redemande une autre liste de positions. Dans ce cas aucun objet ne devrai être modifié par une liste de positions invalide.

ça aurait été super si on pouvait faire comme cela, mais je crains hélas on ne peut pas, du moins moi je ne peux pas. je m'explique. tout d'abord est valide test les coups mais le problème est qu'il teste un coup APRES que ce coup soit jouer, ou du moins après qu'on ait tenté de le jouer et non pas avant..sinon pour revenir à ton idée de base qui est de tester les positions reçues pour jouer le coup...et voir si ces postions vont générer un coupInvalide et donc redemander une autre liste de positons avant de jouer..je ne vois pas comment on le ferait sans jouer d'abord jouer....c'est toute la raison d'être des méthodes est valide et aussi du coup invalide exception..

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  karemkadidola le Dim 11 Avr 2010, 00:33

mba a écrit:remarque : une clause finally est toujours exécutée (qu'il y ait eu exception ou pas).

L'idée du booléen peut fonctionner, mais pourquoi pas plutôt dans le catch ?

j'avais déjà fait avec un while (condition) qui englobait le blocs try-catch-catch et dans le bloc finally j'y mettais (la condition) qui me retournait dans ma boucle while en cas de problème ça n'a pas marché...je pense je n'ai juste pas encore trouvé la bonne façon de le faire c'est à dire le bon endroit où mettre quoi...

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  karemkadidola le Dim 11 Avr 2010, 01:07

mba a écrit:remarque : une clause finally est toujours exécutée (qu'il y ait eu exception ou pas).

L'idée du booléen peut fonctionner, mais pourquoi pas plutôt dans le catch ?

j'ai essayé aussi de le mettre plutot dans le catch mais là aussi pas beaucoup de succès là au moins j'ai cru comprendre pourquoi ça ne marchait pas, (je me trompe peut être)
comme c'était dans une boucle while (booléen) { } je reaffectais mon (booléen) seulement avant de quitter la boucle, mais le problème c'est qu'en cas d'exception celle ci était lancée avant d'arriver à cette ligne d'instruction (où je reaffectait mon booléen) et donc pas de retour dans la boucle - c'est ce que je me suis donné comme explication en tout cas - bon je n'ai pas fini de chercher une solution...mais si jamais quelqu'un trouve ça serait génial de partager l'idée...
Une solution que je pense pourrait marcher mais que je ne veux même pas essayer puisque je pense que c'est une mauvaise façon de programmer c'est dans chaque bloc catch faire encore un autre try-catch et ainsi de suite, autant de fois. cela voudrait dire que si je les imbrique par exemple 5 fois les uns dans les autres. le joueur aura seulement 5 fois la possibilité de jouer des coups invalides sans que le programme ne s'arrête....pas encore une bonne solution à mon avis....

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  Wark le Dim 11 Avr 2010, 11:33

Et ça serait aussi très gourmand.

Et pas moyen de réécrire une méthode estValide dans le package accessible publiquement ? :p

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  karemkadidola le Dim 11 Avr 2010, 14:12

estValide est une des methodes d'un objet Coup (déplacement ou prise pion) écrire juste la méthode estValide en dehors de la classe Coup....je ne pense pas que ça aiderait beaucoup....

moi il y juste quelque chose que je ne comprend pas. dan le code ci - bas Je ne retourne pas dans la boucle while (erreur) { } comme je le devrais en cas d'erreur. comme si l'exception m'empechait d'une façon ou d'une autre de retourner dans la boucle while. mais par contre si au premier ou deuxième essai le joueur entre un coup valide tout se poursuit normalement. mais si le coup valide est introduit au troisème essaie le programme se termine quand même?? alors que normalement il devrait recommencer au niveau de try avec une liste de positions que j'ai pris soins de fournir dans le bloc finally
Code:


public void jouerUnCoup (List<Position> positions)throws CoupInvalideException,
     CloneNotSupportedException{

         boolean erreur = true;
         int chiffreTest = 0;

         CoupFactory usineCoup = new CoupFactory();
         Coup coupAJouer;

         while (erreur) {
        try{
            coupAJouer = usineCoup.créerCoup(positions,this.état);
            coupAJouer.jouer(this.état);
            chiffreTest = 1;
        } catch(IllegalArgumentException i){
            System.out.println(i.getMessage());
            positions = this.état.getJoueurCourant().choisirMouvements(this.état);
            coupAJouer = usineCoup.créerCoup(positions,this.état);
            coupAJouer.jouer(this.état);
            chiffreTest = 1;
        }catch(CoupInvalideException c){
            System.out.println(c.getMessage());
            positions = this.état.getJoueurCourant().choisirMouvements(this.état);
            coupAJouer = usineCoup.créerCoup(positions,this.état);
            coupAJouer.jouer(this.état);
            chiffreTest = 1;
        }finally{
            if (chiffreTest==0){
           //tous les coups étaient invalides
           positions = this.état.getJoueurCourant().choisirMouvements(this.état);
            }else{
           erreur = false;
            }
        }
         }
     }



karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  aro le Dim 11 Avr 2010, 16:58

karemkadidola a écrit:moi il y juste quelque chose que je ne comprend pas. dan le code ci - bas Je ne retourne pas dans la boucle while (erreur) { } comme je le devrais en cas d'erreur. comme si l'exception m'empechait d'une façon ou d'une autre de retourner dans la boucle while. mais par contre si au premier ou deuxième essai le joueur entre un coup valide tout se poursuit normalement. mais si le coup valide est introduit au troisème essaie le programme se termine quand même?? alors que normalement il devrait recommencer au niveau de try avec une liste de positions que j'ai pris soins de fournir dans le bloc finally
Je ne sais pas trop ce que vous devez faire mais en regardant le code il semble évident qu'une exception pourrait être lancée dans le bloc d'un catch et elle n'est pas interceptée => pourquoi pas :
Code:

public void jouerUnCoup (List<Position> positions)throws CoupInvalideException,
     CloneNotSupportedException{

         boolean erreur = true;

         CoupFactory usineCoup = new CoupFactory();
         Coup coupAJouer;

         while (erreur) {
            try{
                coupAJouer = usineCoup.créerCoup(positions,this.état);
                coupAJouer.jouer(this.état);
                erreur = false;
            } catch(IllegalArgumentException i){
                System.out.println(i.getMessage());
                positions = this.état.getJoueurCourant().choisirMouvements(this.état);
            }catch(CoupInvalideException c){
                System.out.println(c.getMessage());
                positions = this.état.getJoueurCourant().choisirMouvements(this.état);
            }
         }
     }

aro

Nombre de messages : 557
Prénom : Anne
Statut : Prof
Date d'inscription : 06/09/2008

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  karemkadidola le Dim 11 Avr 2010, 17:46

Merci Beaucoup, beaucoup madame Aro,!

voilà je viens d'essayer et ça marche nickel!!! le joueur peut maintenant se tromper autant de fois qu'il veut, le jeu continue quand même!!!

encore une fois! merci beaucoup!!

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  aro le Dim 11 Avr 2010, 19:04

Il reste quand même les deux blocs catch qui font la même chose qui sont agaçants. Ne devrait-il pas y avoir des traitements différents des deux types d’exceptions ?

aro

Nombre de messages : 557
Prénom : Anne
Statut : Prof
Date d'inscription : 06/09/2008

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  karemkadidola le Dim 11 Avr 2010, 19:21

aro a écrit:Il reste quand même les deux blocs catch qui font la même chose qui sont agaçants. Ne devrait-il pas y avoir des traitements différents des deux types d’exceptions ?

tout à l'heure j'ai vraiment oublié de Dire

YOU ARE WONDERFULL !! YOU REALLY SAVED MY LIFE

sinon pour le traitement là il n'y a aucun problème puisque moi ce que je veux c'est que le joueur rejoue un coup valide après avoir joué un coup invalide. or les deux types d'exceptions sont provoquées par deux situations tout à fait differentes
le premier (IAE) c'est si les deux premières positions dans la liste de position ne sont pas en diagonale. aucun coup n'est crée par l'objet CoupFactory (ni DéplacementPion , ni PrisePion) car pas de distance possible entre les 2 premières positions.
le deuxième (CIE) il y a bien un coup qui est crée (DeplacementPion ou PrisePion selon valeur de la distace entre les deux premières positions de la liste de positions) mais seulement le coup est invalide.

Ainsi pour les deux exceptions le traiment reste le même. (faire rejouer le joueurConsole).....

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  Wark le Dim 11 Avr 2010, 19:59

Alors, pourquoi ne pas catcher une simple exception ?

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  karemkadidola le Dim 11 Avr 2010, 20:58

Wark a écrit:Alors, pourquoi ne pas catcher une simple exception ?

Très bien trouvé cher wark!!! ça me parait une bonne idée étant donné que le traitement est le même, pour les deux types d'exception.

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  karemkadidola le Dim 11 Avr 2010, 21:03

Confirmation je viens d'essayer comme suggéré et ça marche nickel...t'es un chef wark !!!!! c'est surement c'est que Mme Aro a voulu me dire tout à l'heure mais que je n'ai pas tout de suite compris de cette façon là. encore merci à vous deux.

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  DjMan42 le Dim 11 Avr 2010, 21:34

Ah, bonne nouvelle. Very Happy

DjMan42

Nombre de messages : 219
Prénom : Eden
Statut : Etudiant 1er Indu
Localisation : Bruxelles
Date d'inscription : 28/10/2008

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  aro le Lun 12 Avr 2010, 10:04

Aucune (mal)chance que this.état soit null ?

aro

Nombre de messages : 557
Prénom : Anne
Statut : Prof
Date d'inscription : 06/09/2008

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  karemkadidola le Lun 12 Avr 2010, 17:42

Pas la moindre chance Madame....

karemkadidola

Nombre de messages : 244
Prénom : aimé
Date d'inscription : 13/10/2009

Revenir en haut Aller en bas

resolu Re: LAJ1 projet phase 2 Gestion d'erreur

Message  Contenu sponsorisé Aujourd'hui à 12:38


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum