Quelles causes ArrayIndexOutOfBoundsException
?
Si vous considérez une variable comme une "boîte" où vous pouvez placer une valeur, alors un tableau est une série de boîtes placées côte à côte, où le nombre de boîtes est un entier fini et explicite.
Créer un tableau comme celui-ci:
final int[] myArray = new int[5]
crée une rangée de 5 cases contenant chacune un int
. Chacune des cases a un index, une position dans la série des cases. Cet index 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 cases, vous pouvez vous y référer via 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'index 0).
Un ArrayIndexOutOfBoundsException
est provoqué en essayant de récupérer une "boîte" qui n'existe pas, en passant un index supérieur à l'indice de la dernière "boîte", ou négatif.
Avec mon exemple en cours d'exécution, ces extraits de code 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 de prévenir ArrayIndexOutOfBoundsException
, il y a quelques points clés à considérer:
Boucle
Lorsque vous parcourez un tableau, assurez-vous toujours que l'index 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 mélangez jamais un =
dedans ..
Vous voudrez peut-être être tenté de faire quelque chose comme ceci:
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
Mais ne le fais pas. Tenez-vous à celui ci-dessus (si vous devez utiliser l'index) et cela vous évitera beaucoup de douleur.
Dans la mesure du possible, utilisez foreach:
for (int value : myArray) {
De cette façon, vous n'aurez pas du tout à penser aux index.
Lors d'une boucle, quoi que vous fassiez, ne modifiez JAMAIS la valeur de l'itérateur de boucle (ici:) i
. Le seul endroit où cela devrait changer de valeur est de maintenir la boucle. Le changer autrement ne fait que risquer une exception et n'est pas nécessaire dans la plupart des cas.
Récupération / mise à jour
Lors de la récupération d'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];
}