¿Qué causa ArrayIndexOutOfBoundsException
?
Si piensa en una variable como un "cuadro" donde puede colocar un valor, una matriz es una serie de cuadros colocados uno al lado del otro, donde el número de cuadros es un entero finito y explícito.
Crear una matriz como esta:
final int[] myArray = new int[5]
crea una fila de 5 cajas, cada una con un int
. Cada una de las cajas tiene un índice, una posición en la serie de cajas. Este índice comienza en 0 y termina en N-1, donde N es el tamaño de la matriz (el número de cajas).
Para recuperar uno de los valores de esta serie de cuadros, puede consultarlo a través de su índice, así:
myArray[3]
Lo que le dará el valor del cuarto cuadro de la serie (ya que el primer cuadro tiene el índice 0).
Un problema ArrayIndexOutOfBoundsException
se produce al intentar recuperar un "cuadro" que no existe, al pasar un índice que es más alto que el índice del último "cuadro", o negativo.
Con mi ejemplo en ejecución, estos fragmentos de código producirían una excepción:
myArray[5] //tries to retrieve the 6th "box" when there is only 5
myArray[-1] //just makes no sense
myArray[1337] //waay to high
Como evitar ArrayIndexOutOfBoundsException
Para prevenir ArrayIndexOutOfBoundsException
, hay algunos puntos clave a considerar:
Bucle
Al recorrer una matriz, asegúrese siempre de que el índice que está recuperando es estrictamente más pequeño que la longitud de la matriz (el número de cajas). Por ejemplo:
for (int i = 0; i < myArray.length; i++) {
Observe el <
, nunca mezcle un =
allí.
Es posible que desee tener la tentación de hacer algo como esto:
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
Solo no lo hagas. Apéguese al anterior (si necesita usar el índice) y le ahorrará mucho dolor.
Donde sea posible, use foreach:
for (int value : myArray) {
De esta manera, no tendrá que pensar en índices en absoluto.
Al hacer un bucle, haga lo que haga, NUNCA cambie el valor del iterador de bucle (aquí:) i
. El único lugar donde esto debería cambiar el valor es mantener el ciclo en marcha. Cambiarlo de otra manera es solo arriesgarse a una excepción, y en la mayoría de los casos no es necesario.
Recuperación / actualización
Al recuperar un elemento arbitrario de la matriz, siempre verifique que sea un índice válido contra la longitud de la matriz:
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];
}