Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur IndexOutOfBoundsException

    29 octobre 2014 à 20:25:00

    Bonjour j'ai fait un programme java, voici le debut :

    public class Exercice7
    {
    
    	public static void main(String [] arg)
    	{
    		/*-----------------------------*/
    		/* Déclaration des constantes  */
    		/*-----------------------------*/
    		
    		final int TAILLEFOIS= 26;
    		final int PIOCHE= 100;
    		
    		
    		
    		/*-----------------------------*/
    		/* Déclaration des variables   */
    		/*-----------------------------*/
    		
    		int[]  tabFois    ;
    		char[] tabPioche  ;
    		char[] tabChevaletUn ;
    		char[] tabChevaletDeux ;
    		int    cpt        ;
    		int    nbJeton    ;
    		char alphabet     ;
    		int  ind          ;
    		int nbFois;
    		
    		/*-----------------------------*/
    		/* Instructions                */
    		/*-----------------------------*/
    		
    		nbJeton = 0;
    		//Instanciation des tableaux
    		
    		
    		tabFois = new int [] { 9,2,2,3,15,2,2,2,8,1,1,5,3,6,6,2,1,6,6,6,6,2,1,1,1,1 };
    		tabPioche  = new char [PIOCHE];
    		tabChevaletUn = new char [PIOCHE/2];
    		tabChevaletDeux = new char [PIOCHE/2];
    		
    		// Ajout des lettres dans la pioche.
    		
    		alphabet= 65 ;
    		cpt = 0 ;
    		while  (alphabet >= 65 && alphabet <= 90 )
    		{
    			nbFois = tabFois [ (int) alphabet - 65 ]+cpt;
    			while (cpt < nbFois)
    			{ 
    				nbJeton = nbJeton +1;
    				tabPioche[cpt] = alphabet;
    				
    				cpt++;
    			}
    			alphabet++;
    		}
    		
    		//Pioche des deux joueurs.
    		cpt=0;
    		while ( nbJeton!= 0)
    		{
    			ind = (int) (Math.random () * (nbJeton ) +1 );
    			tabChevaletUn[cpt] = tabPioche[ind];
    			tabPioche[ind]= tabPioche [nbJeton];
    			nbJeton=nbJeton -1;
    			
    			ind = (int) (Math.random () *( nbJeton+1) );
    			tabChevaletDeux[cpt] = tabPioche[ind];
    			tabPioche[ind]= tabPioche [nbJeton];
    			nbJeton--;
    			cpt=cpt+1;
    		}
    		//Affichage des chevalets
    		
    		cpt=0;
    		
    		while (cpt < nbJeton/2 )
    		{
    			System.out.print ( " " + tabChevaletUn[cpt] + " | ");
    			cpt++;
    		}
    		cpt= 0;
    		while (cpt < nbJeton/2 )
    		{
    			System.out.print ( " " + tabChevaletDeux[cpt] + " | ");
    			cpt= cpt +1;
    		}
    		
    	}
    
    }


    Le programme ce compile mais lors ce que je le lance je tombe sur cette erreur :

    " Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0

    at Exercice7.main<Exercice7.java:63>

    Je n'arrive pas a fixer cette erreur, lorsque j'y arrive sans faire expres j'ai la même mais sur d'autre lignes.Pourvez vous m'expliquer ??

    -
    Edité par Enaelle 30 octobre 2014 à 14:03:41

    • Partager sur Facebook
    • Partager sur Twitter
      29 octobre 2014 à 21:49:20

      Par pitié, ton code est illisible sans coloration syntaxique, utilises le bouton .

      Et c'est moi ou tu as copier deux fois le même code ? Je ne comprend pas les mecs qui ne relisent pas leur post une fois qu'il est posté (surtout quand c'est leur sujet), c'est navrant :colere2:

      EDIT : Bon j'ai relus tant bien que mal ton code farfelu, et c'est normale que ça plante, tu initialises un tableau de taille 0 (tabPioche) et tu va ensuite muter l'index 9 de ton tableau dans ton premier tour de boucle (juste avant que ça plante) 

      -
      Edité par LeSuricateFurtif 29 octobre 2014 à 22:11:41

      • Partager sur Facebook
      • Partager sur Twitter
      Un de ces quatre, viens faire un tour sur Zeste de Savoir !
        30 octobre 2014 à 12:15:14

        Bonjour,

        Oui, les balises serait bien ^^.

        benoit45 a écrit:

        EDIT : Bon j'ai relus tant bien que mal ton code farfelu, et c'est normale que ça plante, tu initialises un tableau de taille 0 (tabPioche) et tu va ensuite muter l'index 9 de ton tableau dans ton premier tour de boucle (juste avant que ça plante) 

        Bien joué ;) (+1) :

                nbJeton = 0; // <==== a zero.
                //Instanciation des tableaux
                
                
                tabFois = new int [] { 9,2,2,3,15,2,2,2,8,1,1,5,3,6,6,2,1,6,6,6,6,2,1,1,1,1 };
                tabPioche  = new char [nbJeton]; // <==== construire un tableau sans possibilite d'entrer des valeurs.
                tabChevaletUn = new char [PIOCHE/2];
                tabChevaletDeux = new char [PIOCHE/2];
                
                // Ajout des lettres dans la pioche.
                
                alphabet= 65 ;
                cpt = 0 ;
                while  (alphabet >= 65 && alphabet <= 90 )
                {
                    nbFois = tabFois [ (int) alphabet - 65 ]+cpt;
                    while (cpt < nbFois)
                    { 
                        nbJeton = nbJeton +1;
                        tabPioche[cpt] = alphabet; // <= ne peut pas entrer de valeur le tableau est initialise a une taille de zero.
                        
                        cpt++;
                    }
                    alphabet++;
                }

        Utiliser une liste à la place (List<char> et la méthode add).

        Bonne continuation.



        -
        Edité par pctronique 30 octobre 2014 à 14:45:52

        • Partager sur Facebook
        • Partager sur Twitter
          30 octobre 2014 à 14:09:40

          Merci de vos réponses et excusez moi pour la mise en page effectivement ^^'

          Mais sinon je ne comprend pas, pourquoi je ne peux entrer de valeur dans le tableau ?? Ma constante PIOCHE est égale à 100 donc le tableau ne fait pas 0 cases si ?

          Au debut j'avais noté ceci :

          nbJeton = 0; // <==== a zero.
                  //Instanciation des tableaux
                   
                   
                  tabFois = new int [] { 9,2,2,3,15,2,2,2,8,1,1,5,3,6,6,2,1,6,6,6,6,2,1,1,1,1 };
                  tabPioche  = new char [nbJeton]; // <==== construire un tableau sans possibilite d'entrer des valeurs.
                  tabChevaletUn = new char [nbJeton/2];
                  tabChevaletDeux = new char [nbJeton/2];
                   
                  // Ajout des lettres dans la pioche.
                   
                  alphabet= 65 ;
                  cpt = 0 ;
                  while  (alphabet >= 65 && alphabet <= 90 )
                  {
                      nbFois = tabFois [ (int) alphabet - 65 ]+cpt;
                      while (cpt < nbFois)
                      {
                          nbJeton = nbJeton +1;
                          tabPioche[cpt] = alphabet; // 
                           
                          cpt++;
                      }
                      alphabet++;
                  }

          Je pensais instancier un tableau de 0, puis lorsque nbJeton reçois plus 1 le tableau pioche augmente aussi. Mais sa ne fonctionne pas nan plus ..

          Sinon j'ai la même erreur à la ligne 76. Désolé je débute je n'avais jamais utilisé les tableau avant

          -
          Edité par Enaelle 30 octobre 2014 à 14:21:03

          • Partager sur Facebook
          • Partager sur Twitter
            30 octobre 2014 à 14:44:39

            Utiliser plutôt :

            List<Character> listPioche = new LinkedList<Character>();
            
            while  (alphabet >= 65 && alphabet <= 90 )
                    {
                        nbFois = tabFois [ (int) alphabet - 65 ]+cpt;
                        while (cpt < nbFois)
                        {
                            // nbJeton = nbJeton +1;
                            listPioche.add(alphabet);
                              
                            cpt++;
                        }
                        alphabet++;
                    }

            Sinon, vous devez recréer à chaque fois un tableau et vous allez perdre les anciennes valeurs et surcharger la mémoire vive (si vous devez agrandir à chaque fois le tableau).

            Normalement avec ce que vous avez modifié :

            tabPioche  = new char [PIOCHE];

            Sa devrais fonctionner.

            -
            Edité par pctronique 30 octobre 2014 à 14:58:20

            • Partager sur Facebook
            • Partager sur Twitter
              30 octobre 2014 à 14:57:42

              Merci, je vais essayer :)

              EDIT : Cela règle bien l'erreur pour cette ligne, mais elle revient à la ligne 76 et je ne comprend toujours pas..

              Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
                      at Exercice7.main(Exercice7.java:76)
              



              Merci encore :)

              -
              Edité par Enaelle 30 octobre 2014 à 15:04:16

              • Partager sur Facebook
              • Partager sur Twitter
                30 octobre 2014 à 15:04:20

                C'est quoi la ligne 76 ?

                C'est un dépassement de tableau.

                -
                Edité par pctronique 30 octobre 2014 à 15:04:50

                • Partager sur Facebook
                • Partager sur Twitter
                  30 octobre 2014 à 15:10:05

                  Ce sont celles ci :

                  cpt=0;
                  		while ( nbJeton!= 0)
                  		{
                  			ind = (int) (Math.random () * (nbJeton ) +1 );
                  			tabChevaletUn[cpt] = tabPioche[ind];
                  			tabPioche[ind]= tabPioche [nbJeton];
                  			nbJeton=nbJeton -1;

                   Je ne vois pas le dépassement

                  -
                  Edité par Enaelle 30 octobre 2014 à 15:13:02

                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 octobre 2014 à 15:26:12

                    Okay merci. Sinon j'ai juste inversé les ligne suivantes et sa à fonctionner je ne sais pas  bien pourquoi xD

                     tabPioche[ind]= tabPioche [nbJeton];
                    nbJeton=nbJeton -1;<br><br>

                    Sinon dernière question et après j'arrête d'abuser de ton aide, pourquoi lors de l'affichage du tableau nbJeton retourne à 0 ??

                    Merci !

                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 octobre 2014 à 15:31:23

                      while ( nbJeton!= 0)
                              {

                      Ici on attends d'avoir que nbJeton soit égal à zéro pour sortir de la boucle.

                      Ensuite nbJeton sera égal à zéro.

                      Je ne comprends pas ce que vous voulez dire par :

                      Enaelle a écrit:

                      Okay merci. Sinon j'ai juste inversé les ligne suivantes et sa à fonctionner je ne sais pas  bien pourquoi xD

                       tabPioche[ind]= tabPioche [nbJeton];
                      nbJeton=nbJeton -1;<br><br>


                      -
                      Edité par pctronique 30 octobre 2014 à 15:33:05

                      • Partager sur Facebook
                      • Partager sur Twitter
                        30 octobre 2014 à 15:50:19

                        Ha ouiiii.... je fait vraiment pas attention ^^'. Merci :)

                        J'ai mis la ligne qui enlève 1 jeton avant celle qui attribut a tabPioche[ ind] le nombre contenue dans la case tabPioche [nbJeton] et Hop plus d'erreur x)

                        J'ai vérifié, il y a le bon nombre de lettre et de case dans chaque chevalet donc c'est parfait :)

                        Merci beaucoup en tout cas pour ta patience x)

                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 octobre 2014 à 16:00:34

                          Ok, je vois.

                          nbJeton devait être égal à 100 et quand vous avez fait :

                          nbJeton=nbJeton -1;

                          Il est passé à 99.

                          Vu qu'on peut récupérer les valeurs du tableau de 0 à 99, le 100 fessait un dépassement de tableau (c'est pour répondre à votre réponse) ;).

                          Mais de rien, avec plaisir.

                          -
                          Edité par pctronique 30 octobre 2014 à 16:01:19

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Erreur IndexOutOfBoundsException

                          × 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