#1 Le 17/12/2008, à 15:51
- Seb03
decriptage d'un message d'erreur en java
J'ai réussi à compiler mon programme (3 classes: Case,Champ,Demineur) mais quand je le passe à l'interpreteur j'ai ce message d'erreur:
seb@seb-laptop:~/Documents/java/Demineur$ java Demineur
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8
at Champ.<init>(Champ.java:22)
at Demineur.<init>(Demineur.java:20)
at Demineur.main(Demineur.java:12)
Pouvez vous me decripter un peu la deuxième ligne sans que je vous empoisonne avec mon code source. Ca m'aiderai à trouver cette p..... d'erreur sur laquelle je m'arrache les cheveux depuis une heure.
merci d'avance
Dernière modification par Seb03 (Le 17/12/2008, à 15:51)
Hors ligne
#2 Le 17/12/2008, à 15:53
- ®om
Re : decriptage d'un message d'erreur en java
C'est simplement que tu tentes d'accéder dans un tableau à un index "trop loin".
Par exemple, tu as un tableau à 5 cases, et tu tentes d'accéder à la 8e.
J'imagine que tu fais ça dans une boucle, si tu nous montrais ta boucle et nous indiquais le contenu de ton tableau, on pourra t'aider davantage
Hors ligne
#3 Le 17/12/2008, à 15:55
- alexduf
Re : decriptage d'un message d'erreur en java
Ben là il va falloir que tu nous montres ton code source.
Sinon le message d'erreur signifie que tu fais accès à un index de tableau qui n'existe pas.
exemple :
int[] toto = new int[7]
System.out.println(toto[7]);
sachant que les tableaux en java (et comme dans BEAUCOUP d'autres langages) sont numérotés à partir de 0.
Je pense aussi qu'un poil de google sur ArrayIndexOutOfBoundsException t'aurais donné la réponse.
[edit] gasp ! Rom dégaine plus vite que son ombre ! [/edit]
Dernière modification par alexduf (Le 17/12/2008, à 15:58)
Hors ligne
#4 Le 17/12/2008, à 17:19
- Seb03
Re : decriptage d'un message d'erreur en java
Waou les réponses sont ultra rapides!!
pour mon code en fait il s'agit du début d'un démineur, mais que l'on complète à mesure de notre apprentissage sur java (c'est que mon deuxième cours)
pour les sources les voilà:
class Case
{
private boolean presenceMine;
private int minesAdj;
public Case()
{
presenceMine = false;
}
public boolean getPresenceMine()
{
return presenceMine;
}
public void setPresenceMine(boolean M)
{
presenceMine = M;
}
public String getTexte()
{
if(getPresenceMine()==true)
return "M";
else
return String.valueOf(minesAdj)+' ';
}
public int getMinesAdj()
{
return minesAdj;
}
public void setMinesAdj(int Madj)
{
minesAdj=Madj;
}
}
//contient le champ de mines
import java.util.*;
public class Champ
{
private int i,j,place=0;
private int largeur, hauteur, nb_mines;
private Case[][] tabcases;
public Champ(int larg, int haut, int nbm)
{
largeur=larg;
hauteur=haut;
nb_mines=nbm;
tabcases = new Case[hauteur][largeur];
placerMines();
for(i=0;i<hauteur;i++)
for(j=0;j<largeur;j++)
if(tabcases[i][j].getPresenceMine()==false)
{
calcNbMinesAdj(i,j);
}
}
private void placerMines()
{
//initialisation du tableau de cases
for(i=0;i<hauteur;i++)
{
for(j=0;j<largeur;j++)
{
tabcases[i][j] = new Case();
}
}
//placement des mines
while(place!=nb_mines)
{
Random rnd = new Random();
int x=rnd.nextInt(hauteur-1);
int y=rnd.nextInt(largeur-1);
if(tabcases[x][y].getPresenceMine()==false)
{
tabcases[x][y].setPresenceMine(true);
place++;
}
}
}
public void affichage()
{
for(i=0;i<hauteur;i++) //lignes
{
for(j=0;j<largeur;j++) //colonnes
{
System.out.print(tabcases[i][j].getTexte());
}
System.out.println();
}
}
private void calcNbMinesAdj(int lig, int col)
{
int bomb=0;
if(lig==0) //1ère ligne
{
if(col==0) //coin sup gauche
{
for(i=lig;i<=lig+1;i++)
for(j=col;j<=col+1;j++)
{
if(tabcases[i][j].getPresenceMine()==true)
bomb++;
}
}
else if(col==largeur-1) //coin sup droit
{
for(i=lig;i<=lig+1;i++)
for(j=col-1;j<=col;j++)
{
if(tabcases[i][j].getPresenceMine()==true)
bomb++;
}
}
else //bord haut
{
for(i=lig;i<=lig+1;i++)
for(j=col-1;j<=col+1;j++)
{
if(tabcases[i][j].getPresenceMine()==true)
bomb++;
}
}
}
else if(lig==hauteur-1) //derniere ligne
{
if(col==0) //coin inf gauche
{
for(i=lig-1;i<=lig;i++)
for(j=col;j<=col+1;j++)
{
if(tabcases[i][j].getPresenceMine()==true)
bomb++;
}
}
else if(col==largeur-1) //coin inf droit
{
for(i=lig-1;i<=lig;i++)
for(j=col-1;j<=col;j++)
{
if(tabcases[i][j].getPresenceMine()==true)
bomb++;
}
}
else //bord bas
{
for(i=lig-1;i<=lig;i++)
for(j=col-1;j<=col+1;j++)
{
if(tabcases[i][j].getPresenceMine()==true)
bomb++;
}
}
}
else //lignes du milieu
{
if(col==0) //bord gauche
{
for(i=lig-1;i<=lig+1;i++)
for(j=col;j<=col+1;j++)
{
if(tabcases[i][j].getPresenceMine()==true)
bomb++;
}
}
else if(col==largeur-1) //bord droit
{
for(i=lig-1;i<=lig+1;i++)
for(j=col-1;j<=col;j++)
{
if(tabcases[i][j].getPresenceMine()==true)
bomb++;
}
}
else //milieu
{
for(i=lig-1;i<=lig+1;i++)
for(j=col-1;j<=col+1;j++)
{
if(tabcases[i][j].getPresenceMine()==true)
bomb++;
}
}
}
tabcases[lig][col].setMinesAdj(bomb);
}
}
//contient le main
public class Demineur
{
public static void main(String[] args)
{
int niveau;
if (args.length==0)
niveau = 1;
else
niveau = Integer.parseInt(args[0]);
new Demineur(niveau);
}
public Demineur(int niveau)
{
Champ mines=null;
switch(niveau)
{
case 1: mines=new Champ(8,8,10);
break;
case 2: mines=new Champ(16,16,40);
break;
case 3: mines=new Champ(32,16,99);
break;
default: mines=new Champ(8,8,10);
}
mines.affichage();
}
}
Je soupsonne le problème de venir de la fonction calcNbMinesAdj parce que le programme tournait avant. Il faut que je revois ça.
Hors ligne
#5 Le 17/12/2008, à 17:35
- rniamo
Re : decriptage d'un message d'erreur en java
d'accord avec toi ... http://rniamo.is-a-geek.com/websvn/file … rille.java tu peux regarder là je crois que ça marche
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#6 Le 17/12/2008, à 18:31
- Seb03
Re : decriptage d'un message d'erreur en java
Ce qui m'étonne un peu dans la fonction nb_voisins que tu m'indique rniamo, c'est qu'elle ne semble pas traiter les exceptions (coin ou bord de grille).
for(int k=-1;k<=1;k++)
{
for(int l=-1;l<=1;l++)
{
indx=i+k;
indy=j+l;
il fait toujours k compris entre -1 et 1 et l compris entre -1 et 1.
Hors ligne
#7 Le 17/12/2008, à 18:41
- alexduf
Re : decriptage d'un message d'erreur en java
Salut je suis aussi d'accord, ta méthode calcNbMinesAdj ne dois pas être bonne. Ceci dit la façon dont elle est codée me semble très fastidieuse !
Regarde en quelques lignes on paut faire la même chose :
private void calcNbMinesAdj(int lig, int col)
{
int bomb=0;
int minY = lig - 1;
int maxY = lig + 1;
int minX = col - 1;
int maxX = col + 1;
if (minX < 0) {
minX = 0;
}
if (maxX >= largeur) {
maxX = 0;
}
if (minY < 0) {
minY = 0;
}
if (maxY >= hauteur) {
maxY = 0;
}
for(i=minY;i<=maxY;i++) {
for(j=minX;j<=maxY;j++)
{
if(tabcases[i][j].getPresenceMine()==true)
bomb++;
}
}
tabcases[lig][col].setMinesAdj(bomb);
}
ou encore plus simple :
private void calcNbMinesAdj(int lig, int col)
{
int bomb=0;
int minY = Math.max(lig - 1, 0);
int maxY = Math.min(lig + 1, hauteur - 1);
int minX = Math.max(col - 1, 0);
int maxX = Math.min(col + 1, largeur - 1);
for(i=minY;i<=maxY;i++) {
for(j=minX;j<=maxY;j++)
{
if(tabcases[i][j].getPresenceMine()==true)
bomb++;
}
}
tabcases[lig][col].setMinesAdj(bomb);
}
En fait c'est 100 fois plus simple de fixer les bornes de ton parcours AVANT de faire ta boucle. Comme ça, pas de test superflu.
Les fonctions min et max sont des fonctions incluses dans java. min(a,b) retournera la plus petite valeur entre a et b.
Du coup, comme tu as vérifié tes index avec min et max, tu es sûr (sauf si je me suis trompé en le tapant) que tes variables ne sortiront pas de la taille des tableaux.
Le but c'était pas de te donner une réponse "toute cuite" mais bien que tu comprennes cette façon de penser : je suis fainéant, je dois préparer mes calculs pour faire le minimum de choses. une fois que t'as pigé ça, ben tu peux coder tout et n'importe quoi.
[edit] j'ai même pas cherché à compiler hein, si ça se trouve ya des bourdes, c'est juste pour que tu vois la logique[/edit]
Dernière modification par alexduf (Le 17/12/2008, à 18:42)
Hors ligne
#8 Le 17/12/2008, à 20:23
- rniamo
Re : decriptage d'un message d'erreur en java
ce que je fait c'est juste tester si la case est valide ou pas donc pas d'exceptions ici. Après c'était juste pour t'indiquer une solution...
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#9 Le 18/12/2008, à 10:29
- Seb03
Re : decriptage d'un message d'erreur en java
Salut je suis aussi d'accord, ta méthode calcNbMinesAdj ne dois pas être bonne. Ceci dit la façon dont elle est codée me semble très fastidieuse !
En fait c'est 100 fois plus simple de fixer les bornes de ton parcours AVANT de faire ta boucle. Comme ça, pas de test superflu.
Les fonctions min et max sont des fonctions incluses dans java. min(a,b) retournera la plus petite valeur entre a et b.Du coup, comme tu as vérifié tes index avec min et max, tu es sûr (sauf si je me suis trompé en le tapant) que tes variables ne sortiront pas de la taille des tableaux.
Le but c'était pas de te donner une réponse "toute cuite" mais bien que tu comprennes cette façon de penser : je suis fainéant, je dois préparer mes calculs pour faire le minimum de choses. une fois que t'as pigé ça, ben tu peux coder tout et n'importe quoi.
[edit] j'ai même pas cherché à compiler hein, si ça se trouve ya des bourdes, c'est juste pour que tu vois la logique[/edit]
c'est clair que ma methode était très fastidieuse mais n'arrivant pas à avoir d'idée pour la simplifier je voulais au moins commencer par faire quelque chose qui marche et ensuite tenter de simplifier. il est vrai que je n'ai pas penser à déclarer les bornes et à faire les tests après.
pour le fait qu'il y ait des bourdes si j'ai bien compris ton code il y en a effectivement une petite il me semble mais c'est tant mieux ça me donne l'occasion de corriger pour être sur que j'ai bien compris.
if (maxY >= hauteur)
{
maxY = 0; /*je pense que c'est hauteur*/
}
en tout cas merci beaucoup ça m'aide à comprendre. je corrige ça après mes cours et je change le sujet en [resolu] dès que ça marche.
Pour rniamo, je te remercie de ta solution qui me permet de me familiariser à du code java. c'est juste que j'essaye de coller à ma solution car il s'agit d'un programme qui nous sert de support pour nos cours: à chaque cours on le reprend et le modifie avec les nouveautées qu'on apprend, le but étant d'avoir fini le programme à la fin du cours. Donc c'est pour ça que je tiens absolument à faire cette methode.
Dernière modification par Seb03 (Le 18/12/2008, à 10:29)
Hors ligne
#10 Le 18/12/2008, à 14:12
- alexduf
Re : decriptage d'un message d'erreur en java
oui effectivement, c'est maxY = hauteur -1 et maxX = largeur - 1
Hors ligne