Erreur java.lang.StackOverflowError

Erreur java.lang.StackOverflowError - Java - Programmation

Marsh Posté le 07-10-2012 à 01:11:21    

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
Reply

Marsh Posté le 07-10-2012 à 01:11:21   

Reply

Marsh Posté le 07-10-2012 à 23:34:05    

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 !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed