Je suis un artiste généraliste 3D, je quitte ma carrière et commence à apprendre la programmation ... J'ai un problème avec le document n ° 5 de c106a.
Le code fonctionne, mais j'ai encore un journal des erreurs 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 augmenter sa capacité par lui-même, a-t-il toujours une 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){
}
}
}
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'index de la liste commence à 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)
tentera d'accéder au 5ème élément de la liste.
Les éléments valides auxquels vous pouvez accéder seraient get(0)
, get(1)
, get(2)
, get(3)
.
Utilisez la réponse ci-dessus ou utilisez une boucle foreach :
for (String str: meString) {
System.out.println(str);
}
Vous avez demandé: "Pourquoi Arraylist, qui peut étirer sa capacité par lui-même, a-t-il toujours une exception OutOfBoundsException ???"
La réponse est: un ArrayList n’étire que sa capacité lorsque:
.add(Object o)
)..addAll(Collection c)
)..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. Alors qu'un ArrayList sera redimensionné dynamiquement lorsque vous changez le contenu, il ne le fera pas si vous essayez simplement de accéder le contenu.
C'est la différence.
Pour éviter d’accéder à un index qui n’existe pas:
i < meString.size()
au lieu de i <= meString.size()
car l'index commence par 0 au lieu de 1.for(String str : meString)
.Si vous utilisez une liste de tableaux 2D, veillez à instancier chaque ligne et chaque élément de la ligne correspondante à l'aide du 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 un nombre j (= n) d'éléments.
Si l'instanciation n'est pas effectuée correctement, une exception IndexOutOfBoundsException peut se produire.