Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Java]ArrayIndexOutBoundsExeption

:(

    5 novembre 2006 à 19:28:58

    Voila, je suis débutant en java, et j'avais pour idée de programmer un carré magique!
    J'ai tout essayé pour ne plus avoir cette erreur, mais il me la met tout le temps, j'ai beau changé les variables, rien du tout ! Je sais qu'il y a un probleme avec les indices commençant à 0, j'avais donc changé la valeur des variables rien n'y fait !
    Quelqu'un peu m'éclairé ?
    Voici le code :



    //Déclaration de variable
                    int i;
                    int j;
                    int taille;
                    int lig;
                    int col;
                    boolean Ok;
                    int[][] t = {{0},{0}};
                   
                    taille = Clavier.saisirInt("Taille du carré magique? ");

                    // Verification du champ de la taille
                    while ((taille % 2 == 0) || taille < 3 || taille > 21)
                    {
                            System.out.print("Erreur sur la taille !\nElle doit etre impaire, et comprise entre 3 et 21\n");
                            taille = Clavier.saisirInt("Taille du carré magique?\n");
                    }
                   
                    t = new int [taille][taille];
                   

    //             Imputation de la premiere valeur
                    lig = taille / 2;
                    col = (taille/2)+1;
                    t[lig][col] = 1;
                   
                    for(i=1; i<=taille*taille; i++)
                    {
                            Ok = false;
                            lig--;
                            col++;
                            while (Ok == true)
                            {
    //                  Tests
                                    if(lig < 1)
                                    {
                                            lig = taille;
                                    }
                                    if(col > taille)
                                    {
                                            col = 1;
                                    }
                                    if(t[lig][col]!=0)
                                    {
                                            lig--;
                                            col--;
                                    }
                                    if(col<1){
                                            col = taille;
                                    }
                                    if (lig<1 || col > taille){
                                            Ok = false;
                                    }
                                    else{
                                            Ok = true;
                                    }
                                   
                            }  //Fin While
                            t[lig][col]=i;
                    }  //Fin Pour
                   
                   
                    System.out.println("Voici le carré magique : \n\n");
                    for(i=1; i<=taille; i++)
                    {
                            for (j=1; j<=taille; j++)
                            {
                                    System.out.println(t[i][j]);
                            }
                    }

    • Partager sur Facebook
    • Partager sur Twitter
      5 novembre 2006 à 20:16:59

      tu n'as pas du comprendre les indices de tableau
      çà va de 0 à taille-1 et non de 1 à taille
      for(i=1; i<=taille; i++)

      c'est faux, çà devrait être :
      for(i=0; i<taille; i++)

      et ya surement quelles autres erreurs
      • Partager sur Facebook
      • Partager sur Twitter
        5 novembre 2006 à 20:21:21

        Non justement,
        ma variable i n'est pas une variable fesant varié les lignes ou colonne du tableau, i est une valeur à mettre dans le tableau :
        t[lig][col]=i;

        Et cette valeur commence à 1
        • Partager sur Facebook
        • Partager sur Twitter
          5 novembre 2006 à 20:24:19

                          for(i=1; i<=taille; i++)
                          {
                                  for (j=1; j<=taille; j++)
                                  {
                                          System.out.println(t[i][j]); // c'est quoi çà ??????
                                  }
                          }
          • Partager sur Facebook
          • Partager sur Twitter
            5 novembre 2006 à 20:25:43

            Oui sa j'ai rectifié juste apres avoir posté mais... mon programme ne va pas jusque la, il se stop à la ligne 65, c'est à dir :
            t[lig][col]=i;
            • Partager sur Facebook
            • Partager sur Twitter
              5 novembre 2006 à 20:44:29

              çà vient de :
                                              if(col<1){
                                                      col = taille;
                                              }

              faudrait que çà soit :
              col = taille - 1;
              • Partager sur Facebook
              • Partager sur Twitter
                5 novembre 2006 à 20:49:36

                Arf, non dsl, ce n'est pas sa aparement ^^!
                Tanpi merci quand meme :)
                • Partager sur Facebook
                • Partager sur Twitter
                  5 novembre 2006 à 20:53:58

                  si c'est çà, mais ce que je n'avais pas vu c'est qu'il y a la même erreur avec lig :
                                                  if(lig < 1)
                                                  {
                                                          lig = taille; // rajoute aussi ici le -1
                                                  }
                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 novembre 2006 à 20:57:29

                    Non non, je t'assure, c'est pas sa :o
                    • Partager sur Facebook
                    • Partager sur Twitter
                      5 novembre 2006 à 21:10:40

                      Tu as mal initialisé ton tableau....

                      int[][] t = {{0},{0}};
                      ....
                      ....
                      ....

                      t = new int [taille][taille]


                      Au début du déclare et initialise un tableau.... à vide! donc pour lui il n'y qu'un indice... le 0.
                      Et lorsque que tu essaies de changer sa taille.... ça plante! donc essaies çà:

                      int[][] t;
                      ....
                      ....
                      ....

                      t = new int [taille][taille]


                      Là ton tableau est déclaré et tu l'initialise après... donc au moment ou tu mets
                      t = new int [taille][taille]
                      , aucune taille n'est encore décidée... et là ça marchera!

                      PS: Et si tu veux à tous prix l'initialiser à vide... là tu peux mettre
                      t = {{0}, {0}};

                      PS2: minirop a raison... ton code est bizarre.... écoute le aussi!
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 novembre 2006 à 22:02:35

                        Je sais que mon code est bizare, c'est l'oeuvre d'un débutant ;) !
                        Cela dit mon code ne marche toujours pas !
                        Je vous le remet, avec les rectifications :

                        import mesOutils.Clavier;
                        public class Carré_Magique {

                                /**
                                 * @param args
                                 */

                                public static void main(String[] args) {
                                        //Déclaration de variable
                                        int i;
                                        int j;
                                        int taille;
                                        int lig;
                                        int col;
                                        boolean Ok;
                                        int[][] t;
                                       
                                        taille = Clavier.saisirInt("Taille du carré magique? ");

                                        // Verification du champ de la taille
                                        while ((taille % 2 == 0) || taille < 3 || taille > 21)
                                        {
                                                System.out.print("Erreur sur la taille !\nElle doit etre impaire, et comprise entre 3 et 21\n");
                                                taille = Clavier.saisirInt("Taille du carré magique?\n");
                                        }
                                       
                                        t = new int [taille][taille];

                        //             Imputation de la premiere valeur
                                        lig = taille / 2;
                                        col = (taille/2)+1;
                                        t[lig][col] = 1;
                                       
                                        for(i=0; i<=(taille)*(taille); i++)
                                        {
                                                Ok = false;
                                                lig--;
                                                col++;
                                                while (Ok == true)
                                                {
                        //                  Tests
                                                        if(lig < 1)
                                                        {
                                                                lig = taille-1;
                                                        }
                                                        if(col > taille)
                                                        {
                                                                col = 1;
                                                        }
                                                        if(t[lig][col]!=0)
                                                        {
                                                                lig--;
                                                                col--;
                                                        }
                                                        if(col<1){
                                                                col = taille-1;
                                                        }
                                                        if (lig<1 || col > taille){
                                                                Ok = false;
                                                        }
                                                        else{
                                                                Ok = true;
                                                        }
                                                       
                                                }  //Fin While
                                                t[lig][col]=i;
                                        }  //Fin Pour
                                       
                                       
                                        System.out.println("Voici le carré magique : \n\n");
                                        for(i=0; i<=taille; i++)
                                        {
                                                for (j=0; j<=taille; j++)
                                                {
                                                        System.out.println("\n" + t[i][j]);
                                                }
                                        }
                                       
                                       
                                        }//Fin
                                }
                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 novembre 2006 à 22:42:06

                          tu as toujours l'erreur dans tes deux boucles à la fin (i<=taille doit devenir i<taille, idem pour j)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 novembre 2006 à 22:45:28

                            Oui, ok, mais le programme n'arrive meme pas jusque la !
                            Il y a une erreur avant aparement, mais j'arrive pas a trouver où !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              5 novembre 2006 à 22:57:37

                              c'est pas le <= dans for(i=0; i<=(taille)*(taille); i++)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                5 novembre 2006 à 23:02:22

                                Non.. C'est pas sa non plus o_O
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  5 novembre 2006 à 23:11:41

                                  tu n'a pas d'erreur précise ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    6 novembre 2006 à 4:05:50

                                    Salut,

                                    Peut tu faire un System.out.println juste avant la ligne qui plante, et y entrer i,taille,lig,col, et nous les montrer? Je crois que ca aiderait...

                                    oh tiens, entre ca :

                                    System.out.println("[i:"+i+"] [taille:"+taille+"] [lig:"+lig+"] [col:"+col+"]");
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
                                      6 novembre 2006 à 7:44:20

                                      Et puis si tu bosse avec un IDE (comme JBuilder par exemple) tu as l'option
                                      ==> Exécuter pas à pas (Sous JBuilder c'est F8)

                                      Là tu verras bien où ton code plante!
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        6 novembre 2006 à 10:22:50

                                        Elle vient de là ton exception: t[lig][col] = i;
                                        Le problème c'est que tu initialises col et lig à une certaine valeur avec col = lig+1. A chaque itération de la boucle for, lig diminue de 1 et col augmente de 1 : donc à un moment tu auras col >= taille et là : ArrayOutOfBoundsException...

                                        Il y a bien des conditions pour éviter ça dans ta boucle while, mais le programme ne rentrera jamais dedans car Ok est toujours faux.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          8 novembre 2006 à 15:01:07

                                          Je suis pas un expert de la programmation en java (debutant encore), mais un tableau ne peut pas contenir des valeurs negatives, non?
                                          et pour "ArrayOutOfBoundsException" on peut contrer ça en gerant cette exception.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            8 novembre 2006 à 20:44:39

                                            Citation : colibri

                                            Je suis pas un expert de la programmation en java (debutant encore), mais un tableau ne peut pas contenir des valeurs negatives, non?
                                            et pour "ArrayOutOfBoundsException" on peut contrer ça en gerant cette exception.



                                            Un tableau peut très bien contenir des valeurs négatives.
                                            ArrayIndexOutOfBoundsException est lancée lorsqu'on accède à un tableau avec un index erroné, c'est à dire négatif, ou bien supérieur ou égal à la taille du tableau.

                                            C'est une RuntimeException, donc la gérer est inutile puisqu'elle traduit une erreur dans le code.
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            [Java]ArrayIndexOutBoundsExeption

                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                            • Editeur
                                            • Markdown