[LAJ1] class Jeu retourner l'etat

Page 1 sur 2 1, 2  Suivant

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

[LAJ1] class Jeu retourner l'etat

Message  Florent le Lun 12 Avr 2010, 16:49

Bonjour,

J'ai un petit soucis avec la récupération d'un Etat à partir de la class Jeu, En effet la méthode dans Etat renvoi un object (protected object clone) et donc je dois le convertir dans la methode getEtat de la class Jeu pour pouvoir l'utiliser

J'ai essayé avec ce code mais ca ne marche pas :

Code:
   public Etat getEtat() {
      Etat copieEtat = (Etat) etat.clone();
      return copieEtat;
   }

Merci pour votre aide Smile

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  DjMan42 le Lun 12 Avr 2010, 17:48

J'ai le même code et sa fonctionne. Essai de voir ta méthode clone de état.

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

Re: [LAJ1] class Jeu retourner l'etat

Message  karemkadidola le Lun 12 Avr 2010, 18:00

Deux possibilités soit dans l'entete signaler que la méthode est susceptible de lancer un CloneNotSupportedException soit le catcher dans le le code de la méthode...via un try catch


Dernière édition par karemkadidola le Lun 12 Avr 2010, 18:04, édité 1 fois

karemkadidola

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

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  karemkadidola le Lun 12 Avr 2010, 18:02

}
Code:
public Etat getEtat() throws CloneNotSuppordedException {
      Etat copieEtat = (Etat) etat.clone();
      return copieEtat;
}
 

karemkadidola

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

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  pbt le Lun 12 Avr 2010, 18:37


_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  Florent le Jeu 15 Avr 2010, 13:56

Bonjour à tous,

ma méthode Etat sans paramètre ne veut pas fonctionner, j'ai pourtant changer les new Joueur par new JoueurConsole,

Je crée dans JeuConsole un nouveau Jeu

Code:
   Jeu j1 = new Jeu();
   presenter(j1.getEtat());

et lorsque je veux présenter cette Etat pour l'affichage il me sort une erreur du style :

Code:
Exception in thread "main" java.lang.StackOverflowError
   at Etat.<init>(Etat.java:84)
   at Jeu.<init>(Jeu.java:14)
   at Etat.<init>(Etat.java:84)
   at Jeu.<init>(Jeu.java:14)
   at Etat.<init>(Etat.java:84)
...... une belle centaine de ligne similaire

j'ai essaye simplement un autre Test en créant simplement un Etat et j'ai la meme erreur donc ca vient pas de ma méthode clone

voici mon constructeur Etat sans paramètre:

Code:

   public Etat() {

      plateau =  new Pion[NB_LIGNES][NB_COLONNES];
                //j'ai supprimer les lignes de remplissage du tableau volontairement...
      joueurs = new JoueurConsole[2];
      joueurs[0] = new JoueurConsole(Couleur.BLANC);
      joueurs[1] = new JoueurConsole(Couleur.NOIR);
      joueurCourant = joueurs[0];
   }

Qu'est-ce qui cloche chez moi?

Merci de votre aide Wink

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  DjMan42 le Jeu 15 Avr 2010, 14:41

Je dirai que c'est ici qu'il y'a un problème
Code:
joueurs = new JoueurConsole[2];
Le problème, c'est que ton attribut joueurs a été déclaré comme un tableau de joueur et non joueurConsole
Essai comme ceci
Code:
joueurs = new Joueur[2];


Dernière édition par DjMan42 le Jeu 15 Avr 2010, 14:56, édité 1 fois

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

Re: [LAJ1] class Jeu retourner l'etat

Message  DjMan42 le Jeu 15 Avr 2010, 14:54

Je retire ce que j'ai dit je viens de tester dans les 2 cas ça fonctionne. Il n'y'a pas d'erreur dans le constructeur état sans paramètre. J'ai quasiment le même.

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

Re: [LAJ1] class Jeu retourner l'etat

Message  DjMan42 le Jeu 15 Avr 2010, 15:47

Clone l'objet etat dans ta méthode clone
Code:
Etat clone = null;
        try {
            clone = (Etat) super.clone(); // clone de l'objet Etat mais pas en profondeur. 
        }catch(CloneNotSupportedException cnse) {

            cnse.printStackTrace(System.err);
        }
puis modifie l'objet copié en faisant clone.setJoueurGagnant(new Joueur (joueurGagnant.getCouleur())) , même chose avec le plateau en faisant attention à ne pas copié les références, ....


Dernière édition par DjMan42 le Jeu 15 Avr 2010, 15:59, édité 1 fois

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

Re: [LAJ1] class Jeu retourner l'etat

Message  Florent le Jeu 15 Avr 2010, 15:59

Je viens d'essayer mais le simple fait de faire un getEtat me renvoi le même paquet d'erreur Suspect

Je continue de chercher bounce

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  DjMan42 le Jeu 15 Avr 2010, 16:06

Il faut aussi implémenter Cloneable.

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

Re: [LAJ1] class Jeu retourner l'etat

Message  Florent le Jeu 15 Avr 2010, 17:37

De cette façon?

Code:

   public Etat getEtat() throws CloneNotSupportedException {
         Etat copieEtat = (Etat) etat.clone();
         return copieEtat;
   }

Le probleme doit de venir d'ailleurs pcq j'ai essayée de renvoyer un etat sans utiliser la methode clone et j'avais les mêmes erreurs

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  DjMan42 le Jeu 15 Avr 2010, 18:11

Exact comme le mien.

Voici ce qui est dit dans l'API java
pour java.lang.StackOverflowError
Thrown when a stack overflow occurs because an application recurses too deeply.

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

Re: [LAJ1] class Jeu retourner l'etat

Message  Anthoblack le Jeu 15 Avr 2010, 22:54

DjMan42 a écrit:Exact comme le mien.

Voici ce qui est dit dans l'API java
pour java.lang.StackOverflowError
Thrown when a stack overflow occurs because an application recurses too deeply.
La pile est surchargée... Trop de données sont placées en mémoire (variables, objets, ...). Faut donc vérifier des boucles infinies explicites (ou non).
Bonne soirée

Anthoblack

Nombre de messages : 764
Age : 28
Prénom : Anthony
Statut : Ex-étudiant
Localisation : Bruxelles
Date d'inscription : 11/03/2008

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  DjMan42 le Jeu 15 Avr 2010, 23:11

Ca peut être dû au fait que le code soit très gourmand en ressources ou que l'ordinateur n'ait pas assez de ressources.
Au lieu d'utiliser netbeans aller vers eclipse ou vers une console linux.
Ou utiliser un autre ordinateur qui a plus de ressources.


Dernière édition par DjMan42 le Jeu 15 Avr 2010, 23:59, édité 1 fois

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

Re: [LAJ1] class Jeu retourner l'etat

Message  Florent le Jeu 15 Avr 2010, 23:22

J'utilise Eclipse ça vient probablement d'une boucle infinie y a plus qu'à la trouvée cyclops

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  pbt le Jeu 15 Avr 2010, 23:50

DjMan42 a écrit:Ca peut être dû au fait que le code soit très gourmand en ressources ou que l'ordinateur n'est pas assez de ressources.
Au lieu d'utiliser netbeans aller vers eclipse ou vers une console linux.
Ou utiliser un autre ordinateur qui a plus de ressources.
Si je comprend bien, tu préconises de changer d'ordonateur si jamais le pojet de java (langage de première) est trop gourmant en ressources .... je préconiserais plutôt de relire le code ^^



_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  Florent le Jeu 15 Avr 2010, 23:54

Ma méthode clone provoque une erreur c'est à n'y rien comprendre je tourne en rond

Code:

java.lang.CloneNotSupportedException: Etat
   at java.lang.Object.clone(Native Method)
   at Etat.clone(Etat.java:21)
   at Jeu.getEtat(Jeu.java:22)
   at JeuConsole.main(JeuConsole.java:23)

Voici ma méthode dans la class Etat:

Code:

   protected Object clone() {
      Etat copie = null;
      try {
         copie = (Etat) super.clone();
      } catch(CloneNotSupportedException cnse) {
         cnse.printStackTrace(System.err);
      }
      // on renvoie le clone
      return copie;
   }

et je la clone de cette façon dans Jeu

Code:

   public Etat getEtat() throws CloneNotSupportedException {
         Etat copieEtat = (Etat) etat.clone();
         return copieEtat;
   }

Merci de votre aide Smile

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  aro le Ven 16 Avr 2010, 11:20

Florent a écrit:J'utilise Eclipse ça vient probablement d'une boucle infinie y a plus qu'à la trouvée
Si tu regardes de plus près ce qui a provoqué l’exception StackOverflowError (notamment en allant voir les lignes données, des centaines de fois, dans les fichiers Jeu.java et Etat.java), tu ne devrais pas trouver une boucle infinie mais plutôt le constructeur de Jeu qui appelle le constructeur d’Etat qui appelle le constructeur de Jeu qui appelle le constructeur d’Etat qui appelle …
Florent a écrit:Ma méthode clone provoque une erreur c'est à n'y rien comprendre je tourne en rond
1. Ce n’est pas ce qui provoque l’erreur mais pas besoin du throws CloneNotSupportedException après getEtat puisque tu interceptes cette exception dans la méthode clone
2. Ce n’est toujours pas ce qui provoque l’erreur mais ne faudrait-il pas un peu s’occuper d’attribut(s) d’Etat dans cette méthode clone ?
3. Plutôt que de tourner en rond Arrow, retourne voir du côté de l'interface Cloneable

aro

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

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  mba le Ven 16 Avr 2010, 11:36

Oui c'est vrai,

c'est bien un problème de récursivité croisée involontaire qui bourre ton stack et donne un stackOveflow :
les deux constructeurs s'appellent l'un l'autre infiniment et à chaque appel on prend un peu de place sur le stack.
Est-il normal que le constructeur d'Etat construise un Jeu ?
Code:
at Etat.<init>(Etat.java:84)

quant à ton clone il ne fait pas vraiment ce qu'on attend : appeler super.clone ne va pas créer un nouvel état identique à l'instance courante.

mba

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

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  Florent le Ven 16 Avr 2010, 11:50

Merci à tous en effet en créant un nouvel Etat je n'ai plus de problème si ma classe Etat n'est plus etendue par Jeu (extends Jeu)

Je suppose qui faut réutiliser les attributs de la classe Jeu comme NB_LINE pour construire le tableau ?

Florent

Nombre de messages : 93
Prénom : Florent
Date d'inscription : 02/02/2010

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  didi le Ven 16 Avr 2010, 12:34

pour la méthode clone

dans class Joueur
le code :


Code:

public abstract class Joueur implements [b]Cloneable[/b]  {
  ........

public Object clone()  {
        Object j = null;
        try {
            j =  super.clone();
        } catch (CloneNotSupportedException e)  {
            System.out.println("erruer en clone ");
        }
        return  j;
    }

et dans class Etat :

Code:



public class Etat implements [b]Cloneable [/b]        {
  ......

    public Object clone()  {
        Pion[][] copiePlateau  ; // copier le plateau
     
        Joueur unJoueurCourant = (Joueur) getJoueurCourant().clone();
        Joueur unJoueurGagnant;
        if(getJoueurGagnant() == null)  {
            unJoueurGagnant = null;
        }else {
            unJoueurGagnant = (Joueur) getJoueurGagnant().clone();
        }
        Joueur[] lesJoueurs ; // copier tableau de joueur
        return new Etat(copiePlateau,unJoueurCourant,unJoueurGagnant,lesJoueurs);
       

    }


dans la class Jeu :

Code:


public Etat getEtat()  {
        return (Etat) état.clone();
    }

normalement ça devait fonctioner
(car chez moi ça fonctionne bien Smile )

didi

Nombre de messages : 215
Prénom : Dinesh
Statut : Smile
Date d'inscription : 21/01/2009

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  mba le Ven 16 Avr 2010, 13:16

Florent a écrit:si ma classe Etat n'est plus etendue par Jeu (extends Jeu)

ah je vois ...
en effet alors le constructeur de Etat faisait appel au constructeur sans paramètres de sa mère Jeu, qui faisait appel au constructeur de Etat ...

Pourquoi cet héritage ?


Dernière édition par mba le Ven 16 Avr 2010, 13:25, édité 1 fois

mba

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

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  aro le Ven 16 Avr 2010, 13:22

Florent a écrit:Je suppose qui faut réutiliser les attributs de la classe Jeu comme NB_LINE pour construire le tableau ?
Ou utiliser length…
didi a écrit:normalement ça devait fonctioner
(car chez moi ça fonctionne bien Smile )
Et pourtant…
Si tu compares un Etat (pas initial mais en cours de partie) et son clone, tu verras que tu dois retourner dans la méthode clone.

aro

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

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  mba le Ven 16 Avr 2010, 13:23

didi a écrit:pour la méthode clone et dans class Etat ...
hem ... le but est de réfléchir pas de donner sa solution toute faite NON ???!

mba

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

Revenir en haut Aller en bas

Re: [LAJ1] class Jeu retourner l'etat

Message  Contenu sponsorisé Aujourd'hui à 15:16


Contenu sponsorisé


Revenir en haut Aller en bas

Page 1 sur 2 1, 2  Suivant

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