ArrayIndexOutOfBoundsException

Fermé
eztec - Modifié par noctambule28 le 8/11/2011 à 10:56
 eztec - 8 nov. 2011 à 13:36
Bonjour,


J'ai donc l'erreur spécifiée dans mon titre, le problème est que je n'arrive pas à la résoudre, voici mon code:


class wait 
{ 
 static void find (int[][] image, double[][] mask)  
 { 
  //Définir tailles max de image: 
  int LimgX = image.length;   
  int LimgY = image[0].length;  
  //Initialiser la position pour image 
  int imgX = 0; 
  int imgY = 0; 
  //Initialiser la position pour sous image 
  int smgX = 0; 
  int smgY = 0; 

  double [][]imagec = new double[LimgY][LimgX]; // imagec = copie de image 
   
   
  while (imgY<LimgY) 
   { 
    imagec[imgY][imgX]=convolution(image,mask,imgX,imgY); 
    if (imgX<LimgX){imgX++;} 
    else if (imgY<LimgY){imgX=0;imgY++;} 
   } 
   
  afficherMatriceDouble(imagec); 
   
  

 } 
 public static double convolution (int[][] image, double[][] mask, int posimgX, int posimgY) 
 { 
  int LimgX = image.length;   
  int LimgY = image[0].length; 
  int Lmask = mask.length; 
  int milieu = (int)Lmask/2; 
  int imgcX = posimgX-milieu; 
  int imgcY = posimgY-milieu; 
  int posMaskX = 0; 
  int posMaskY = 0; 
  double somme = 0; 
  while (posMaskY<Lmask) 
  { 
   if (imgcX > 0 && imgcY > 0 && posimgX+milieu < LimgX && posimgY + milieu< LimgY) 
   { 
    somme = somme + image[imgcY][imgcX]*mask[posMaskY][posMaskX]; 
   } 
   if (posMaskX<Lmask) {posMaskX++;imgcX++;}//dépasse 
   else if (posMaskY<Lmask){posMaskY++;imgcX=imgcX-Lmask-1;posMaskX=0;imgcY++;} 
  } 
  return somme; 
 } 
  
  
 static void afficherUnTableau(int[] tab) 
 { 
  int af=0; 
  while (af!=tab.length) 
  { 
   System.out.print(tab[af]+" "); 
   af++; 
  } 
 } 
 static void afficherMatrice (int[][] matrice) 
 { 
  int ar=0; 
  while (ar!=matrice.length) 
  { 
   afficherUnTableau(matrice[ar]); 
   System.out.println(); 
   ar++; 
  } 
 } 
  static void afficherUnTableauDouble(double[] tab) 
 { 
  int af=0; 
  while (af!=tab.length) 
  { 
   System.out.print(tab[af]+" "); 
   af++; 
  } 
 } 
 static void afficherMatriceDouble (double[][] matrice) 
 { 
  int ar=0; 
  while (ar!=matrice.length) 
  { 
   afficherUnTableauDouble(matrice[ar]); 
   System.out.println(); 
   ar++; 
  } 
 } 
 public static void main(String[]args) 
 { 
  System.out.println("Voici le fichier testé"); 
  int[][] image = new int[3][4]; 
  image[0][0] = 6; 
  image[1][0] = 7; 
  image[2][0] = 5; 
  image[0][1] = 3; 
  image[1][1] = 1; 
  image[2][1] = 2; 
  image[0][2] = 1; 
  image[1][2] = 1; 
  image[2][2] = 1; 
  image[0][3] = 1; 
  image[1][3] = 2; 
  image[2][3] = 3; 
  afficherMatrice (image); 
  System.out.println("Voici le masque"); 
  double[][] masque = new double[3][3]; 
  masque[0][0] = 3; 
  masque[1][0] = 4; 
  masque[2][0] = 3; 
  masque[0][1] = 2; 
  masque[1][1] = 1; 
  masque[2][1] = 2; 
  masque[0][2] = 2; 
  masque[1][2] = 2; 
  masque[2][2] = 2; 
  afficherMatriceDouble(masque); 
  find(image, masque); 
   
 } 
}


Le problème viendrait du while de la méthode convolution, si j'enlève le if à l'interieur de celle-ci, j'ai un -1 au lieu de 3 (en indice d'erreur)

Et si j'enlève le else je n'ai plus d'erreur... Mais comme dit plus haut, je n'arrive pas à corriger

2 réponses

KX Messages postés 16755 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 12 février 2025 3 020
8 nov. 2011 à 12:35
Au moment où ça plante tu as mask = [[3.0, 2.0, 2.0], [4.0, 1.0, 2.0], [3.0, 2.0, 2.0]]
Et tu essayes de faire mask[2][3].

Il faut que tu rajoutes une condition, par exemple if (maskX<mask[maskY].length)
0
Merci de ta réponse, cependant je ne vois pas et ne comprends pas où et pourquoi placer cette condition.

En fait mon masque est toujours de taille impaire et carré, donc la longue de mask[y] est la même que mask (ici 3)

j'ai modifié la condition d'incrémentation de mon comme tel: if (posMaskX<LmaskX-1) mais ça bug toujours
0