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.

13voto

Makoto Points 23751

Pour éviter une exception de type "array index out-of-bounds", il faut utiliser la fonction amélioré- for où et quand ils le peuvent.

La motivation principale (et le cas d'utilisation) est lorsque vous itérez et que vous n'avez pas besoin d'étapes d'itération compliquées. Vous pourriez no être en mesure d'utiliser un système d'aide à la décision. for pour reculer dans un tableau ou itérer uniquement sur un élément sur deux.

Vous êtes assuré de ne pas manquer d'éléments à itérer en procédant ainsi, et votre exemple [corrigé] est facilement convertible.

Le code ci-dessous :

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

...est équivalent à ceci :

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

9voto

Dans votre code, vous avez accédé aux éléments de l'index 0 à la longueur du tableau de chaînes. name.length donne le nombre d'objets de type chaîne dans votre tableau d'objets de type chaîne, c'est-à-dire 3, mais vous ne pouvez accéder qu'à l'index 2. name[2] , parce que le tableau peut être accédé de l'index 0 à name.length - 1 où vous obtenez name.length nombre d'objets.

Même en utilisant un for vous avez commencé avec l'indice zéro et vous devriez terminer avec name.length - 1 . Dans un tableau a[n] vous pouvez accéder de a[0] à a[n-1].

Par exemple :

String[] a={"str1", "str2", "str3" ..., "strn"};

for(int i=0; i<a.length(); i++)
    System.out.println(a[i]);

Dans votre cas :

String[] name = {"tom", "dick", "harry"};

for(int i = 0; i<=name.length; i++) {
    System.out.print(name[i] +'\n');
}

7voto

nIKHIL Points 98

Pour votre tableau donné, la longueur du tableau est de 3 (c'est-à-dire que name.length = 3). Mais comme il stocke les éléments à partir de l'indice 0, il a un indice maximum de 2.

Ainsi, au lieu de "i**<= nom.longueur', vous devriez écrire 'i <**nom.longueur' pour éviter 'ArrayIndexOutOfBoundsException'.

4voto

Satyendra Kumar Points 157

Voilà pour cette simple question, mais je voulais juste souligner une nouvelle fonctionnalité de Java qui évitera toutes les confusions autour de l'indexation dans les tableaux, même pour les débutants. Java-8 a abstrait la tâche d'itération pour vous.

int[] array = new int[5];

//If you need just the items
Arrays.stream(array).forEach(item -> { println(item); });

//If you need the index as well
IntStream.range(0, array.length).forEach(index -> { println(array[index]); })

Quel est l'avantage ? D'abord, la lisibilité comme l'anglais. Ensuite, vous n'avez pas à vous soucier de la ArrayIndexOutOfBoundsException

3voto

Kyri Sarantakos Points 898

Le cas le plus courant que j'ai rencontré pour des exceptions ArrayIndexOutOfBoundsExceptions apparemment mystérieuses, c'est-à-dire apparemment non causées par votre propre code de gestion des tableaux, est l'utilisation simultanée de SimpleDateFormat. En particulier dans une servlet ou un contrôleur :

public class MyController {
  SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");

  public void handleRequest(ServletRequest req, ServletResponse res) {
    Date date = dateFormat.parse(req.getParameter("date"));
  }
}

Si deux threads entrent ensemble dans la méthode SimplateDateFormat.parse(), vous verrez probablement une exception ArrayIndexOutOfBoundsException. Notez la section de synchronisation de la javadoc de la classe pour SimpleDateFormat .

Assurez-vous qu'il n'y a pas d'endroit dans votre code qui accède à des classes non sécurisées comme SimpleDateFormat d'une manière concurrente comme dans une servlet ou un contrôleur. Vérifiez toutes les variables d'instance de vos servlets et contrôleurs pour trouver des suspects potentiels.

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