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

 Java Discussion :

Gestion d'exception en IHM (sudoku)


Sujet :

Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2016
    Messages : 7
    Par défaut Gestion d'exception en IHM (sudoku)
    Bonjour,

    Je souhaite tester si un objet de type fenetre (créé dans une autre classe) existe avant de lui appliquer une méthode.
    En pratique, ce cas ne se produira jamais (sauf si le joueur clique sur correction avant d'avoir vu la grille), mais ça génère une erreur lors de la compilation.

    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
    public void actionPerformed(ActionEvent e){
    	   int[][]tab1 = {{6,3,1,8,4,5,2,9,7},{4,5,2,7,3,9,1,6,8},{9,8,7,6,1,2,4,5,3},{8,7,4,9,6,3,5,2,1},{5,6,9,2,7,1,3,8,4},{2,1,3,5,8,4,6,7,9},{7,4,8,1,2,6,9,3,5},{1,9,6,3,5,8,7,4,2},{3,2,5,4,9,7,8,1,6}};
    	   int[][]tab2 = {{6,3,1,8,4,5,2,9,7},{4,5,2,7,3,9,1,6,8},{9,8,7,6,1,2,4,5,3},{8,7,4,9,6,3,5,2,1},{5,6,9,2,7,1,3,8,4},{2,1,3,5,8,4,6,7,9},{7,4,8,1,2,6,9,3,5},{1,9,6,3,5,8,7,4,2},{3,2,5,4,9,7,8,1,6}};
    	   fenetre game;
    	   if(e.getSource()==btPlay){
    			System.out.println("Je viens de cliquer sur play");
    			sudoku S = new sudoku(tab1,tab2,3);
    			S.shuffle();
    			S.affichage();
    			S.hide();  
    			game = new fenetre(S); //création de la fenetre qui affiche la grille à compléter 
    			//tout fonctionne jusqu'ici
    		}else{
    			System.out.println("Je viens de cliquer sur correct");
    			/*je veux tester si game existe avant d'appeler la méthode check de la classe fenetre
    			 * pour corriger le sudoku (check ne génère pas de problème à la compilation)
    			 * il paraît qu'on peut le faire avec des exceptions (connais pas) */	
    			}
    	 }
    Merci d'avance

  2. #2
    Membre Expert Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Par défaut
    Salut,

    Dans ton cas tu n'as pas vraiment besoin de mettre en place une gestion des exceptions, tu peux simplement tester si ta variable est égal à "null" (donc pas initialisée).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    fenetre game = null; // Ici tu dois initialiser ta variable à null
    
    if(e.getSource()==btPlay)
    {
        // Tu lances ta partie
    }
    else
    {
      if( game == null ) // Si aucune partie n'a été lancée
        return;            // On ne sort d'ici et on ne fait rien (on peut afficher un message aussi)
    
      // Sinon c'est qu'une partie est en cours et on peut lancer la correction
    }
    Ceci dis si tu as une erreur à la compilation (et non pas à l’exécution) c'est surement parce que tu essais d'utiliser ta variable "game" sans l'avoir initialiser au préalable (initialiser à null dans mon cas). La solution que je te propose évite simplement d'avoir une erreur de type NullPointerException à l'exécution.

    Sinon pour ce qui est de la gestion des exceptions en Java, je t'invite à lire ce cours.

    cdt.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2016
    Messages : 7
    Par défaut
    Je crois comprendre ce que vous proposez, mais il me semble que ce code va réinitialiser fenetre à null dès que actionPerformed sera appelée.
    Or, on a besoin d'attributs de fenetre pour lancer une méthode de vérification de la grille. Il y a-t-il un moyen d'éviter cela ?

  4. #4
    Membre Expert Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Par défaut
    Effectivement je suis allé un peu vite dans ma réponse.

    En fait il te faudrait déclarer cette variable comme attribut de ta classe.

    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
     
    public class MaClasse {
     
    private fenetre game = null;
     
    // ..........
     
    public void actionPerformed(ActionEvent e){
     
      if(e.getSource()==btPlay){
        ....
        game = new fenetre();
      }
      else
      {
        if( game == null )
          return;
      }
    }
    }
    Ça te permettra aussi de pouvoir accéder à cette variable autre part dans ton code.

    Après si tu peux aussi écrire une petite fonction qui fait ce test pour pouvoir la réutiliser ailleurs. C'est plus propre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public boolean isGameStarted()
    {
      return game != null;
    }
    Mais alors autant aller encore plus loin et créer une variable booléenne que tu tiendras a jour pour savoir si une partie est en cours ou non.

    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
     
    public class MaClasse {
     
    private fenetre game;
    private boolean isGameStarted = false;
     
    public void actionPerformed(ActionEvent e){
     
      if(e.getSource()==btPlay){
        // ....
        game = new fenetre();
        isGameStarted = true;
      }
      else
      {
        if( !isGameStarted )
          return;
      }
    }
     
    public boolean isGameStarted()
    {
      return isGameStarted;
    }
    }
    Cdt.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2016
    Messages : 7
    Par défaut Problème d'exécution
    Maintenant ça compile, merci beaucoup.

    En revanche, voila ce qu'on obtient quand on clique sur "correct" si l'objet "fenetre" existe (en pj). Je ne comprend pas du tout ce que cela signifie.
    Si l'objet "fenetre" n'a pas encore été créé (autrement dit si le joueur n'a pas encore cliqué sur play), rien ne se passe, ce qui me semble normal.

    De plus, est il normal que l'objet "fenetre" ne se créée pas de la même façon quand on le crée depuis actionPerformed() que lorsqu'on le crée depuis le main ?
    Depuis le main, il s'affiche correctement, alors que les JTextField sont minuscules si on appelle le constructeur de fenetre dans actionPerformed(). Est ce qu'il y a un mot clef à ajouter ?

    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
     
    public void actionPerformed(ActionEvent e){
    	   int[][]tab1 = {{6,3,1,8,4,5,2,9,7},{4,5,2,7,3,9,1,6,8},{9,8,7,6,1,2,4,5,3},{8,7,4,9,6,3,5,2,1},{5,6,9,2,7,1,3,8,4},{2,1,3,5,8,4,6,7,9},{7,4,8,1,2,6,9,3,5},{1,9,6,3,5,8,7,4,2},{3,2,5,4,9,7,8,1,6}};
    	   int[][]tab2 = {{6,3,1,8,4,5,2,9,7},{4,5,2,7,3,9,1,6,8},{9,8,7,6,1,2,4,5,3},{8,7,4,9,6,3,5,2,1},{5,6,9,2,7,1,3,8,4},{2,1,3,5,8,4,6,7,9},{7,4,8,1,2,6,9,3,5},{1,9,6,3,5,8,7,4,2},{3,2,5,4,9,7,8,1,6}};
    	   if(e.getSource()==btPlay){
    			sudoku S = new sudoku(tab1,tab2,3);
    			S.shuffle();  //brasse les chiffres dans les tableaux pour obtenir une grille différente
    			S.hide();     // remplace des chiffres par des 0 (pour les remplacer par des JTextField vides et éditables
    			game = new fenetre(S); //création de la fenetre qui affiche la grille à compléter 
    			isGameStarted = true;	
    		}else{
    			if(!isGameStarted){
    				return;
     
    			}else{
    				game.check();
    				System.out.println("clic sur correct");
    			}		
    		}
    	 }
    Images attachées Images attachées  

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2016
    Messages : 7
    Par défaut Précision
    Le code de la méthode check (pour la correction) peut être utile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void check(){
    		int[][] tab = new int[9][9];
    		for(int i=0 ; i<9 ; i++){
    			for(int j=0 ; j<9; j++){
    				if(generalCell[i][j].getText().matches("[1-9]*")){
    					tab[i][j]= Integer.parseInt(generalCell[i][j].getText()) ;//lire la valeur contenue dans le JTextfield blanc[i][j] du JPanel gris[l][c]
    				}else{
    					generalCell[i][j].setBackground(Color.red);
    					tab[i][j] = 0;
    				}
    			}
    		}
    	}
    generalCell est une variable de la classe "fenetre". C'est un tableau de JTextField qui contient toutes les cases de la grille.
    D'après le message d'erreur à l'exécution, il doit y avoir un problème avec parseInt()

  7. #7
    Membre Expert Avatar de Nico02
    Homme Profil pro
    Developpeur Java/JEE
    Inscrit en
    Février 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Developpeur Java/JEE
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 728
    Par défaut
    Le problème vient de ton expression régulière dans ta méthode check() à la ligne if(generalCell[i][j].getText().matches("[1-9]*")). Quand tu écris [1-9]*, l'étoile signifie que tu cherches 0, 1 ou n occurrences de [1-9]

    Ducoup quand tu fais ce test sur une chaine vide, ça te retourne vrai car il trouve 0 occurrences et tu exécutes la ligne Integer.parseInt(generalCell[i][j].getText()) qui va provoquer une NumberFormatException.

    En fait tout est écris dans ta ligne d’erreur si tu regardes bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    java.lang.NumberFormatException: For input string "" 
      at ...
      at ...
      at fenetre.check()(fenetre.java:93) // Ici tu as la ligne qui te retourne l'erreur
    Je te le signale car il est très important pour un dev d'arriver à lire une trace pour debugger son programme. Avec un peu d'habitude tu trouveras très souvent tes erreurs toi même

    Ducoup pour ton problème il te suffit simplement d'enlever ton étoile et écrire if(generalCell[i][j].getText().matches("[1-9]")).

    Pour ce qui est de l’instanciation de ta classe, non il n'y a aucune différence quand au moment où tu l'instancies. La vrai question c'est de savoir ce que tu fais entre temps qui pourrait provoquer un mauvais affichage

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2016
    Messages : 7
    Par défaut
    Merci beaucoup,

    Maintenant check() fonctionne bien.
    Effectivement il faut que j'apprenne à interpréter les messages d'erreurs, merci encor pour les infos.

    Augustin

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

Discussions similaires

  1. [ORACLE 9i] Gestion des exceptions
    Par sygale dans le forum SQL
    Réponses: 6
    Dernier message: 19/08/2004, 15h06
  2. Gestion des exception (EOleException)
    Par shurized dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/06/2004, 17h25
  3. [C#] Gestion d'exception
    Par ALCINA dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2004, 12h18
  4. [XMLRAD] gestion des exceptions
    Par pram dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 17h48
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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