350 votes

Qu'est-ce qui provoque une exception java.lang.ArrayIndexOutOfBoundsException et comment puis-je l'éviter ?

Qu'est-ce que ArrayIndexOutOfBoundsException et comment s'en débarrasser ?

Voici un exemple de code qui déclenche l'exception :

String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) {
    System.out.println(names[i]);
}

1 votes

En ce qui concerne la dernière question, un code serait utile. Accédez-vous au tableau avec un index connu, ou devez-vous commencer à déboguer pour comprendre comment l'index est calculé lorsque l'erreur se produit ?

49 votes

Remplacer i <= name.length con i < name.length - ou mieux, écrire une boucle for améliorée. ( for (String aName : name) { ... } )

2 votes

Cela signifie que vous voulez obtenir un élément du tableau qui n'existe pas, 'i<=name.length' signifie que vous voulez obtenir l'élément length+1 - qui n'existe pas.

2voto

ArrayIndexOutOfBounds signifie que vous essayez d'indexer une position dans un tableau qui n'est pas alloué.

Dans ce cas :

String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
    System.out.println(name[i]);
}
  • name.length est 3 puisque le tableau a été défini avec 3 objets String.
  • Lorsqu'on accède au contenu d'un tableau, la position commence à 0. Puisqu'il y a 3 éléments, cela signifie que nom[0]="tom", nom[1]="dick" et nom[2]="harry".
  • Quand vous faites une boucle, puisque i peut être inférieur ou égal à name.length, vous essayez d'accéder à name[3] qui n'est pas disponible.

Pour contourner ce problème...

  • Dans votre boucle for, vous pouvez faire i < nom.longueur. Cela empêcherait de boucler jusqu'à name[3] et s'arrêterait plutôt à name[2].

    for(int i = 0; i<name.length; i++)

  • Utilisez une boucle for each

    String[] name = { "tom", "dick", "harry" }; for(String n : name) { System.out.println(n); }

  • Utiliser list.forEach(Consumer action) (nécessite Java8)

    String[] name = { "tom", "dick", "harry" }; Arrays.asList(name).forEach(System.out::println);

  • Convertir un tableau en flux - c'est une bonne option si vous voulez effectuer des "opérations" supplémentaires sur votre tableau, par exemple filtrer, transformer le texte, convertir en carte, etc.

    String[] name = { "tom", "dick", "harry" }; --- Arrays.asList(name).stream().forEach(System.out::println); --- Stream.of(name).forEach(System.out::println);

1voto

adn.911 Points 1112

ArrayIndexOutOfBoundsException signifie que vous essayez d'accéder à un index du tableau qui n'existe pas ou qui est en dehors des limites de ce tableau. Les index des tableaux commencent à partir de 0 et se terminent à longueur - 1 .

Dans votre cas

for(int i = 0; i<=name.length; i++) {
    System.out.print(name[i] +'\n'); // i goes from 0 to length, Not correct
}

ArrayIndexOutOfBoundsException se produit lorsque vous essayez d'accéder l'élément indexé name.length qui n'existe pas (l'index du tableau se termine à la longueur -1). Il suffit de remplacer <= par < pour résoudre ce problème.

for(int i = 0; i < name.length; i++) {
    System.out.print(name[i] +'\n');  // i goes from 0 to length - 1, Correct
}

1voto

Selon votre code :

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<=name.length; i++) {
  System.out.print(name[i] +'\n');
}

Si vous vérifiez System.out.print(nom.longueur) ;

vous en obtiendrez 3 ;

cela signifie que la longueur de votre nom est de 3

votre boucle fonctionne de 0 à 3 qui devrait fonctionner de "0 à 2" ou de "1 à 3".

Réponse :

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<name.length; i++) {
  System.out.print(name[i] +'\n');
}

1voto

ZiadM Points 140

Chaque élément d'un tableau est appelé un élément, et on accède à chaque élément par son index numérique. Comme le montre l'illustration précédente, la numérotation commence par 0 . Le 9ème élément, par exemple, sera donc accessible à l'index 8.

L'exception IndexOutOfBoundsException est levée pour indiquer qu'un index quelconque (comme celui d'un tableau, d'une chaîne ou d'un vecteur) est hors de portée.

Tout tableau X, peut être accédé de [0 à (X.length - 1)].

1voto

John Czukkermann Points 380

Je vois toutes les réponses ici expliquant comment travailler avec des tableaux et comment éviter les exceptions d'index hors limites. Personnellement, j'évite les tableaux à tout prix. J'utilise les classes Collections, ce qui évite toute la bêtise de devoir gérer les indices des tableaux. Les constructions de boucles fonctionnent parfaitement avec les collections, ce qui rend le code plus facile à écrire, à comprendre et à maintenir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X