Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1471 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Erreur java.lang.StackOverflowError

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur java.lang.StackOverflowError

n°2159421
maximus953​80
Posté le 07-10-2012 à 01:11:21  profilanswer
 

Bonjour tout le monde.
 
Voilà mon problème. Je suis en train de programmer en JAVA un programme permettant de générer des grilles de Sudoku. Le programme est fonctionnel car il me génère des grilles. Malheureusement, il ne me génère pas tout le temps la grille, et toutes les x lancements de la compilation du code (le x varie entre 3 à 32 en moyenne), j'ai un beau message d'erreur : java.lang.StackOverflowError.
 
Est ce que quelqu'un pourrait m’expliquer le fait que la plupart du temps le programme marche sauf les fois ou il me met ce message d'erreur?
 
Merci d'avance !
 
Voici le code :
 

Code :
  1. public class Grille {
  2.     private int[][] sudoku;
  3.     public Grille() {
  4.         sudoku = new int[9][9];
  5.         genGrille(0, 0);
  6.     }
  7.     public int[][] getGrille() {
  8.         return sudoku;
  9.     }
  10.     private void genGrille(int x, int y) {
  11.         if (x < 9) {
  12.             if (x == -1) {
  13.                 System.out.println("Erreur !!!!" );
  14.             }
  15.             int precvaleur = sudoku[x][y];
  16.             sudoku[x][y] = 10;
  17.             int[] possible = new int[9];
  18.             int compteur = 0;
  19.             for (int i = 1; i <= 9; i++) {
  20.                 if (verif(x, y, i)) {
  21.                     possible[compteur] = i;
  22.                     compteur++;
  23.                 }
  24.             }
  25.             int nbalea = (int) (Math.random() * compteur);
  26.             sudoku[x][y] = possible[nbalea];
  27.             //System.out.println("Le nombre aléatoire est "+nbalea+" qui ajoute le nombre "+sudoku[x][y]);
  28.             if (possible[nbalea] == 0) {
  29.                 if (y > 0) {
  30.                     if (x == 0 && y == 0) {
  31.                         genGrille(x, y);
  32.                     } else if (y == 0) {
  33.                         genGrille(x, y - 1);
  34.                     } else {
  35.                         genGrille(x - 1, 8);
  36.                     }
  37.                 }
  38.             }
  39.             if (y == 8) {
  40.                 //System.out.println(sudoku[x][y]);
  41.                 genGrille(x + 1, 0);
  42.             } else {
  43.                 //System.out.print(sudoku[x][y] + " " );
  44.                 genGrille(x, y + 1);
  45.             }
  46.         }
  47.     }
  48.     private boolean verifligne(int x, int nombre) {
  49.         int i = 0;
  50.         while (i < 8 && sudoku[x][i] != nombre) {
  51.             i++;
  52.         }
  53.         if (sudoku[x][i] == nombre) {
  54.             return false;
  55.         }
  56.         return true;
  57.     }
  58.     private boolean verifcolonne(int y, int nombre) {
  59.         int i = 0;
  60.         while (i < 8 && sudoku[i][y] != nombre) {
  61.             i++;
  62.         }
  63.         if (sudoku[i][y] == nombre) {
  64.             return false;
  65.         }
  66.         return true;
  67.     }
  68.     private boolean verifcarre(int x, int y, int nombre) {
  69.         if (y < 3 && x < 3) {
  70.             return carre(0, 0, nombre);
  71.         } else if (y < 6 && x < 3) {
  72.             return carre(0, 3, nombre);
  73.         } else if (y < 9 && x < 3) {
  74.             return carre(0, 6, nombre);
  75.         } else if (y < 3 && x < 6) {
  76.             return carre(3, 0, nombre);
  77.         } else if (y < 6 && x < 6) {
  78.             return carre(3, 3, nombre);
  79.         } else if (y < 9 && x < 6) {
  80.             return carre(3, 6, nombre);
  81.         } else if (y < 3 && x < 9) {
  82.             return carre(6, 0, nombre);
  83.         } else if (y < 6 && x < 9) {
  84.             return carre(6, 3, nombre);
  85.         } else if (y < 9 && x < 9) {
  86.             return carre(6, 6, nombre);
  87.         }
  88.         return false;
  89.     }
  90.     private boolean carre(int x, int y, int nombre) {
  91.         for (int i = x; i <= x + 2; i++) {
  92.             for (int j = y; j <= y + 2; j++) {
  93.                 if (sudoku[i][j] == nombre) {
  94.                     return false;
  95.                 }
  96.             }
  97.         }
  98.         return true;
  99.     }
  100.     private boolean verif(int x, int y, int nombre) {
  101.         if (!verifligne(x, nombre)) {
  102.             return false;
  103.         }
  104.         if (!verifcolonne(y, nombre)) {
  105.             return false;
  106.         }
  107.         if (!verifcarre(x, y, nombre)) {
  108.             return false;
  109.         }
  110.         return true;
  111.     }
  112. }


 
Dans mon main je fais juste un appel pour créer une nouvelle grille.
 
Voici le message d'erreur :
 

Code :
  1. Exception in thread "main" java.lang.StackOverflowError
  2. at gsudoku2.Grille.genGrille(Grille.java:35)
  3. at gsudoku2.Grille.genGrille(Grille.java:59)
  4. at gsudoku2.Grille.genGrille(Grille.java:59)
  5. at gsudoku2.Grille.genGrille(Grille.java:56)
  6. at gsudoku2.Grille.genGrille(Grille.java:50)
  7. at gsudoku2.Grille.genGrille(Grille.java:59)
  8. at gsudoku2.Grille.genGrille(Grille.java:59)
  9. at gsudoku2.Grille.genGrille(Grille.java:59)
  10. at gsudoku2.Grille.genGrille(Grille.java:56)
  11. at gsudoku2.Grille.genGrille(Grille.java:50)
  12. at gsudoku2.Grille.genGrille(Grille.java:59)
  13. at gsudoku2.Grille.genGrille(Grille.java:59)
  14. at gsudoku2.Grille.genGrille(Grille.java:59)
  15. at gsudoku2.Grille.genGrille(Grille.java:56)
  16. at gsudoku2.Grille.genGrille(Grille.java:50)
  17. at gsudoku2.Grille.genGrille(Grille.java:59)
  18. at gsudoku2.Grille.genGrille(Grille.java:59)
  19. at gsudoku2.Grille.genGrille(Grille.java:59)
  20. at gsudoku2.Grille.genGrille(Grille.java:56)
  21. at gsudoku2.Grille.genGrille(Grille.java:50)
  22. at gsudoku2.Grille.genGrille(Grille.java:59)
  23. at gsudoku2.Grille.genGrille(Grille.java:59)
  24. at gsudoku2.Grille.genGrille(Grille.java:59)
  25. at gsudoku2.Grille.genGrille(Grille.java:56)
  26. at gsudoku2.Grille.genGrille(Grille.java:50)
  27. at gsudoku2.Grille.genGrille(Grille.java:59)
  28. at gsudoku2.Grille.genGrille(Grille.java:59)
  29. at gsudoku2.Grille.genGrille(Grille.java:59)
  30. at gsudoku2.Grille.genGrille(Grille.java:56)
  31. at gsudoku2.Grille.genGrille(Grille.java:50)
  32. at gsudoku2.Grille.genGrille(Grille.java:59)
  33. at gsudoku2.Grille.genGrille(Grille.java:59)
  34. at gsudoku2.Grille.genGrille(Grille.java:59)
  35. at gsudoku2.Grille.genGrille(Grille.java:56)
  36. at gsudoku2.Grille.genGrille(Grille.java:50)
  37. at gsudoku2.Grille.genGrille(Grille.java:59)
  38. at gsudoku2.Grille.genGrille(Grille.java:59)
  39. at gsudoku2.Grille.genGrille(Grille.java:59)
  40. at gsudoku2.Grille.genGrille(Grille.java:56)
  41. at gsudoku2.Grille.genGrille(Grille.java:50)
  42. [...]
  43. Java Result: 1


 
Voici enfin le résultat quand tout ce passe normalement :
(l'affichage est gérer dans le main)
 

Code :
  1. run:
  2. --------------------------
  3. | 7 6 8  | 1 9 4  | 3 2 5 |
  4. | 5 9 2  | 7 8 3  | 4 1 6 |
  5. | 1 3 4  | 5 2 6  | 7 8 9 |
  6. --------------------------
  7. | 8 7 1  | 4 6 9  | 5 3 2 |
  8. | 9 5 3  | 2 1 8  | 6 4 7 |
  9. | 4 2 6  | 3 5 7  | 1 9 8 |
  10. --------------------------
  11. | 6 1 7  | 9 3 2  | 8 5 4 |
  12. | 3 8 9  | 6 4 5  | 2 7 1 |
  13. | 2 4 5  | 8 7 1  | 9 6 3 |
  14. BUILD SUCCESSFUL (total time: 0 seconds)


Message édité par maximus95380 le 07-10-2012 à 01:23:25
mood
Publicité
Posté le 07-10-2012 à 01:11:21  profilanswer
 

n°2159488
zapan666
Tout est relatif
Posté le 07-10-2012 à 23:34:05  profilanswer
 

Ta méthode genGrille est récursive : il y a un cas où elle ne fait que s'appeler elle même (il manque un critère d'arrêt) et ça pète en StackOverFlow (tu as rempli la pille d'appel)


---------------
my flick r - Just Tab it !

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Erreur java.lang.StackOverflowError

 

Sujets relatifs
Erreur de requetage, help.Java JAIN-SIP + enregistrement
Java - Besoin d'aide pour les JPanelLe if sur une valeur Null me retourne une erreur
Erreur de Link (Visual C++ 2005)erreur de bibibliothèque au 1011ieme rappel.
Erreur d'exécution 9Recherche codeur en java (plugin Minecraft)
Comment changer mon message d'erreur ? :)Erreur HTTP 500 (Internal Server Error) sur un dossier
Plus de sujets relatifs à : Erreur java.lang.StackOverflowError


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR