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.

3voto

roottraveller Points 4532

Vous obtenez ArrayIndexOutOfBoundsException en raison de i<=name.length partie. name.length retourne la longueur de la chaîne name qui est 3. Par conséquent, quand vous essayez d'accéder à name[3] c'est illégal et cela déclenche une exception.

Code résolu :

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

Il est défini dans le Spécification du langage Java :

En public final champ length qui contient le nombre de composants du tableau. length peut être positif ou nul.

3voto

Johny Points 315

Array index out of bounds exception

Voilà à quoi ressemble ce type d'exception lorsqu'elle est levée dans Eclipse. Le chiffre en rouge indique l'index auquel vous avez essayé d'accéder. Le code ressemblerait donc à ceci :

myArray[5]

L'erreur est déclenchée lorsque vous essayez d'accéder à un index qui n'existe pas dans ce tableau. Si un tableau a une longueur de 3,

int[] intArray = new int[3];

alors les seuls index valides sont :

intArray[0]
intArray[1]
intArray[2]

Si un tableau a une longueur de 1,

int[] intArray = new int[1];

alors le seul indice valable est :

intArray[0]

Tout entier égal à la longueur du tableau, ou plus grand qu'elle : est hors limites.

Tout nombre entier inférieur à 0 : est hors limites ;

P.S. : Si vous cherchez à mieux comprendre les tableaux et à faire des exercices pratiques, il y a une vidéo ici : Tutoriel sur les tableaux en Java

3voto

Bill the Lizard Points 147311

Pour les tableaux multidimensionnels, il peut être délicat de s'assurer que l'on accède à l'option length propriété de la bonne dimension. Prenez par exemple le code suivant :

int [][][] a  = new int [2][3][4];

for(int i = 0; i < a.length; i++){
    for(int j = 0; j < a[i].length; j++){
        for(int k = 0; k < a[j].length; k++){
            System.out.print(a[i][j][k]);
        }
        System.out.println();
    }
    System.out.println();
}

Chaque dimension a une longueur différente, donc le bug subtil est que les boucles du milieu et de l'intérieur utilisent le format length de la même dimension (parce que a[i].length est la même chose que a[j].length ).

Au lieu de cela, la boucle interne devrait utiliser a[i][j].length (ou a[0][0].length pour simplifier).

2voto

Mohit Points 567

Pour tout tableau de longueur n, les éléments du tableau auront un indice de 0 à n-1.

Si votre programme tente d'accéder à un élément (ou une mémoire) dont l'indice de tableau est supérieur à n-1, Java lancera l'opération suivante ArrayIndexOutOfBoundsException

Voici donc deux solutions que nous pouvons utiliser dans un programme

  1. Maintenir le compte :

    for(int count = 0; count < array.length; count++) {
        System.out.println(array[count]);
    }

    Ou une autre déclaration en boucle comme

    int count = 0;
    while(count < array.length) {
        System.out.println(array[count]);
        count++;
    }
  2. Une meilleure solution consiste à utiliser une boucle for each, dans laquelle le programmeur n'a pas besoin de se préoccuper du nombre d'éléments du tableau.

    for(String str : array) {
        System.out.println(str);
    }

2voto

sgrpwr Points 164

ArrayIndexOutOfBoundsException : chaque fois que cette exception se produit, cela signifie que vous essayez d'utiliser un indice de tableau qui est hors de ses limites ou, en termes simples, que vous demandez plus que ce que vous avez initialisé.

Pour éviter cela, assurez-vous toujours que vous ne demandez pas un index qui n'est pas présent dans le tableau, c'est-à-dire que si la longueur du tableau est de 10, votre index doit être compris entre 0 et 9.

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