Java Arraylist a java.lang.IndexOutOfBoundsException?


Je suis un artiste 3D général, j'ai quitté ma carrière et j'ai commencé à apprendre la programmation. J'ai un problème avec le document c106a # 5.

Le code fonctionne, mais j'ai encore un journal d'erreur ici.

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.get(ArrayList.java:322)
at UniqueNames.showUnique(UniqueNames.java:23)
at UniqueNames.main(UniqueNames.java:39)

Pourquoi Arraylist, qui peut étirer sa capacité par lui-même, obtient-il toujours un OutOfBoundsException?

Voici mon code complet:

import acm.io.*;
import acm.program.ConsoleProgram;
import acm.util.*;
import java.io.*;
import java.util.ArrayList;
import java.lang.*;

public class UniqueNames extends ConsoleProgram{

  static ArrayList<String> meString = new ArrayList<String>();
  static String input ;

    public static void storeUnique(String input){
        if (!meString.contains(input))
           {
            meString.add(input);
            }
    }

    public static void showUnique(ArrayList<String> meString){
        System.out.println("Unique name list contains:");
        for(int i=0 ;i<= meString.size() ;i++){
            System.out.println(meString.get(i));
          }
      }

    public static void main(String[] args){

             try{
                InputStreamReader stream = new InputStreamReader(System.in);
                BufferedReader br = new BufferedReader(stream);
                   while (true){
                       System.out.println("Enter name:");
                       String input = br.readLine();
                       if (input.equals("")) break;
                       storeUnique(input);
                      }  

                  {showUnique(meString);}  
                }
             catch(IOException e){
                }
    }
}
Author: iCodez, 2013-08-26

4 answers

Les lignes suivantes:

for (int i = 0; i <= meString.size(); i++) {
    System.out.println(meString.get(i));
}

Devrait être:

for (int i = 0; i < meString.size(); i++) {
    System.out.println(meString.get(i));
}

C'est parce que l'indice de la liste commence à partir de zéro.

Index: 4, Size: 4 explique un peu plus. Lorsque vous appelez get(4), une exception se produit car votre liste n'a qu'une taille de 4. get(4) tenterait d'accéder au 5ème élément de la liste.

Éléments Valides que vous pouvez accéder à serait get(0), get(1), get(2), get(3).

 14
Author: ꜱᴜʀᴇꜱʜ ᴀᴛᴛᴀ, 2016-06-16 21:35:13

Utiliser la réponse ci-dessus, ou vous pouvez utiliser un boucle foreach:

for (String str: meString) {
    System.out.println(str);
}
 5
Author: Ankit, 2017-05-23 12:33:32

Vous avez demandé: "Pourquoi Arraylist, qui peut étirer sa capacité par ses propres moyens, obtient-il toujours une OutOfBoundsException ???"
La réponse est: une ArrayList n'étend sa capacité que lorsque:

  1. Vous y ajoutez un objet ( .add(Object o)).
  2. Vous y ajoutez le contenu d'une autre collection ( .addAll(Collection c) ).
  3. Vous assurez sa taille (.ensureCapacity(int minCapacity) ).

Le problème que vous rencontrez est que vous essayez d'accéder à un objet dans un index de la liste qui n'existe pas. Tout en un ArrayList redimensionne dynamiquement lorsque vous modifiez le contenu, il ne le fera pas lorsque vous essayez simplement de accéder à le contenu.
C'est la différence.
Pour éviter d'accéder à un index qui n'existe pas:

  1. Prenez la suggestion de Surresh Atta: Utilisez i < meString.size() au lieu de i <= meString.size() car l'index commence par 0 au lieu de 1.
  2. Prenez la suggestion d'Ankit et utilisez simplement la boucle for améliorée: for(String str : meString).
 4
Author: James Dunn, 2013-08-26 14:38:39

Si vous utilisez une ArrayList 2D ,assurez-vous d'instancier chaque ligne et chaque élément de la ligne correspondante en utilisant le code suivant:

 for(int i=0;i<n;i++)
    {
        p.add(new ArrayList<Integer>());
        for(int j=0;j<n;j++)
        {
            p.get(i).add(new Integer(0));
        }
    }

Cela crée une ArrayList avec i (=n) lignes et chaque ligne contient une ArrayList avec j (=n) nombre d'éléments.

Si l'instanciation n'est pas effectuée correctement, cela peut entraîner une IndexOutOfBoundsException

 0
Author: Harish Chandrasekaran, 2018-09-20 14:14:23