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.

333voto

Jon Skeet Points 692016

Votre premier port d'appel devrait être le documentation qui l'explique assez clairement :

Lancé pour indiquer qu'un tableau a été accédé avec un index illégal. L'index est soit négatif, soit supérieur ou égal à la taille du tableau.

Donc, par exemple :

int[] array = new int[5];
int boom = array[10]; // Throws the exception

Quant à savoir comment l'éviter... hum, ne faites pas ça. Soyez prudent avec vos index de tableaux.

Un problème que les gens rencontrent parfois est de penser que les tableaux sont indexés à 1, par exemple.

int[] array = new int[5];
// ... populate the array here ...
for (int index = 1; index <= array.length; index++)
{
    System.out.println(array[index]);
}

Le premier élément (index 0) ne sera pas pris en compte et une exception sera levée lorsque l'index sera 5. Les index valides ici sont de 0 à 4 inclus. La méthode correcte et idiomatique for La déclaration serait ici :

for (int index = 0; index < array.length; index++)

(C'est en supposant que vous besoin de l'index, bien sûr. Si vous pouvez utiliser la boucle for améliorée à la place, faites-le).

59voto

BalusC Points 498232
if (index < 0 || index >= array.length) {
    // Don't use this index. This is out of bounds (borders, limits, whatever).
} else {
    // Yes, you can safely use this index. The index is present in the array.
    Object element = array[index];
}

Voir aussi :


Mise à jour : comme dans votre extrait de code,

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

L'index est inclusif de la longueur du tableau. C'est hors limites. Vous devez remplacer <= par < .

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

27voto

aioobe Points 158466

Extrait de cet excellent article : ArrayIndexOutOfBoundsException dans la boucle for

Pour faire court :

Dans la dernière itération de

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

i sera égal à name.length ce qui est un indice illégal, puisque les indices des tableaux sont basés sur zéro.

Votre code devrait être le suivant

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

19voto

Octavian Damiean Points 20620

Cela signifie que vous essayez d'accéder à un index d'un tableau qui n'est pas valide car il n'est pas entre les limites.

Par exemple, cela initialiserait un tableau d'entiers primitifs avec la borne supérieure 4.

int intArray[] = new int[5];

Les programmeurs comptent à partir de zéro. Donc, par exemple, ceci lancerait un ArrayIndexOutOfBoundsException car la borne supérieure est 4 et non 5.

intArray[5];

5 votes

Les bornes sont les limites de l'intervalle, c'est-à-dire 0-5.

15voto

Tobb Points 2164

Quelles sont les causes ArrayIndexOutOfBoundsException ?

Si vous considérez une variable comme une "boîte" dans laquelle vous pouvez placer une valeur, alors un tableau est une série de boîtes placées les unes à côté des autres, où le nombre de boîtes est un nombre entier fini et explicite.

Créer un tableau comme ceci :

final int[] myArray = new int[5]

crée une rangée de 5 boîtes, chacune contenant une int . Chacune des boîtes a un indice, une position dans la série de boîtes. Cet indice commence à 0 et se termine à N-1, où N est la taille du tableau (le nombre de cases).

Pour récupérer l'une des valeurs de cette série de boîtes, vous pouvez vous y référer par le biais de son index, comme ceci :

myArray[3]

Ce qui vous donnera la valeur de la 4ème case de la série (puisque la première case a l'indice 0).

Un site ArrayIndexOutOfBoundsException est causé par la tentative de récupérer une "boîte" qui n'existe pas, en passant un index qui est plus élevé que l'index de la dernière "boîte", ou négatif.

Dans mon exemple, les extraits de code suivants produiraient une telle exception :

myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high

Comment éviter ArrayIndexOutOfBoundsException

Afin d'éviter ArrayIndexOutOfBoundsException il y a quelques points clés à prendre en compte :

Looping

Lorsque vous effectuez une boucle dans un tableau, assurez-vous toujours que l'indice que vous récupérez est strictement inférieur à la longueur du tableau (le nombre de cases). Par exemple :

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

Remarquez le < ne jamais mélanger un = là-dedans..

Vous pourriez être tenté de faire quelque chose comme ça :

for (int i = 1; i <= myArray.length; i++) {
    final int someint = myArray[i - 1]

Ne le faites pas. Tenez-vous-en à celle qui précède (si vous devez utiliser l'index) et cela vous épargnera bien des soucis.

Dans la mesure du possible, utilisez le foreach :

for (int value : myArray) {

De cette façon, vous n'aurez pas à penser aux index.

Lorsque vous effectuez une boucle, quoi que vous fassiez, ne modifiez JAMAIS la valeur de l'itérateur de la boucle (ici : i ). Le seul endroit où cette valeur doit changer est pour que la boucle continue. Le changer autrement, c'est risquer une exception, et dans la plupart des cas, ce n'est pas nécessaire.

Récupération/mise à jour

Lorsque vous récupérez un élément arbitraire du tableau, vérifiez toujours qu'il s'agit d'un index valide par rapport à la longueur du tableau :

public Integer getArrayElement(final int index) {
    if (index < 0 || index >= myArray.length) {
        return null; //although I would much prefer an actual exception being thrown when this happens.
    }
    return myArray[index];
}

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