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];
}
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
coni < 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.
1 votes
fr.wikipedia.org/wiki/Off-by-one_error
0 votes
Le tableau sort de ses limites lorsque l'indice que vous essayez de manipuler est supérieur à la longueur du tableau. Pour être correct, vos indices doivent toujours être inférieurs d'une unité au nombre total d'éléments du tableau, car l'indice du tableau commence à 0 et non à 1.
0 votes
Le classique
null
exception du pointeur.