Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème Random

Problème lors de l'initialisation d'un nombre Random

Sujet résolu
    14 octobre 2011 à 17:35:54

    Bonjour,

    J'ai besoin d'un nombre Random pour choisir un objet au hasard dans une ArrayList<MonObjet> array, où MonObjet est une class "quelconque". Mon nombre Random est instancié ainsi : (j'ai aussi mis comment j'ai choisis l'objet au hasard dans mon ArrayList, c-a-d l'objet objetAuHasard)
    int x = r.nextInt(array.size());
    
    MonObjet objetAuHasard = ((MonObjet)array.get(x));
    


    Malheureusement, lorsque je lance mon programme (qui comporte ensuite un traitement pour l'objet choisis au hasard), il y a une erreur qui s'affiche :
    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    


    A mon avis, c'est parce que le nombre choisis au hasard n'est pas approprié à la taille de l'ArrayList (peut être que ca la dépasse, bien que je crois qu'on ne puisse la dépasser), malgré le fait que mon ArrayList ne soit pas vide (j'affiche sa taille dans la console).
    J'ai alors besoin de votre aide pour résoudre ce problème o_O merci ! (si vous avez besoin de plus d'informations sur mon code, demandez moi :-° )
    • Partager sur Facebook
    • Partager sur Twitter
      14 octobre 2011 à 18:25:29

      salut,

      C'est marrant, c'est la deuxième fois en moins de 5 minutes que je réponds à quelqu'un qui a une ArrayOutOfBoundException.

      lis ce qui est écrit : Index: 0, Size: 0. ça signifie que tu essaie d'accéder à l'élément d'Index 0 (le premier) d'une liste de taille 0 (donc vide).

      Je ne sais pas ce que tu affiche, mais au moment ou tu choisi ton objet au hasard, la taille de ta liste est nulle.

      Hedi
      • Partager sur Facebook
      • Partager sur Twitter
        14 octobre 2011 à 18:31:57

        Salut,

        Pourtant ma liste n'est pas vide (l'exemple que j'ai posté n'est pas le seul ! J'ai par exemple pu obtenir:
        Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
        Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 5, Size: 5
        Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
        Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
        


        Et mon objetAuHasard est choisi entre 0 et la taille de array - 1 (à ce que j'ai lu sur Internet, mais en changeant l'initialisation avec
        int x = r.nextInt(array.size()-1);
        

        ca ne change rien)... :o
        • Partager sur Facebook
        • Partager sur Twitter
          14 octobre 2011 à 18:39:34

          non, non elle est pas vide. c'est juste qu'à chaque fois tu accède à l'élément suivant le dernier (qui donc n'existe pas).

          l'index n d'une liste de taille n est en dehors de cette liste. Alors je ne sais pas d'ou vient le problème (surtout avec aussi peu de code). Mais là tu tape en dehors de la liste,

          Hedi
          • Partager sur Facebook
          • Partager sur Twitter
            14 octobre 2011 à 18:42:47

            Comment est-ce que je peux taper en dehors de la liste ? o_O mon nombre est programmé pour "sortir" un nombre entre 0 et la taille de l'ArrayList... Du coup, je ne devrais jamais avoir d'erreur, enfin je crois...

            Qu'est-ce que tu veux dire par << Tu accèdes à l'élément suivant le dernier (qui donc n'esxiste pas)>> ?
            • Partager sur Facebook
            • Partager sur Twitter
              14 octobre 2011 à 18:55:21

              bah l'exception est claire : index n size n. ça signifie que tu essaie d'accéder au n+1ième élément d'une liste de n élément.

              Souviens toi qu'une liste va de 0 à size-1
              donc
              int l[] = new int[3];
              l[3] = 3; //arrayOutOfBound
              

              je me souviens plus de la syntaxe exacte, désolé.

              Hedi
              • Partager sur Facebook
              • Partager sur Twitter
                14 octobre 2011 à 19:03:35

                Oui c'est vrai ! J'ai un peu changé mon programme, en rajoutant un int qui contient la taille de mon ArrayList, et changé la syntaxe de l'instanciation de mon nombre au hasard :
                //La taille de l'arrayList
                int tailleArray = array.size();
                
                //L'instanciation du nombre au hasard, où r est le Random:
                int x = r.nextInt(tailleArray) ;
                


                Du coup, je n'ai plus la même erreur (enfin :-° ), mais... Une autre :colere2: , qui me dit:
                Exception in thread "main" java.lang.IllegalArgumentException: n must be positive
                


                Mais d'après moi, n (qui désigne ici mon nombre au hasard x) est toujours positif, puisque entre 0 et tailleArray (qui sera, au plus "bas", égal à 0, puisque la taille d'une ArrayList ne peut être négative).
                Que se passe-t-il ? o_O
                • Partager sur Facebook
                • Partager sur Twitter
                  14 octobre 2011 à 19:13:04

                  Plop,

                  La taille de ta liste est de zéro.

                  Lis la documentation de nextInt
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 octobre 2011 à 9:18:40

                    Effectivement, c'était là le problème ! Merci beaucoup
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Problème Random

                    × 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