¿Qué causa una excepción java.lang.ArrayIndexOutOfBoundsException y cómo puedo evitarla?
¿Qué ArrayIndexOutOfBoundsException
significa y cómo me deshago de él?
Aquí hay un ejemplo de código que desencadena la excepción:
String[] names = { "tom", "bob", "harry" };
for (int i = 0; i <= names.length; i++) {
System.out.println(names[i]);
}
Su primer punto de referencia debe ser la documentación que lo explique con razonable claridad:
Se lanza para indicar que se ha accedido a una matriz con un índice ilegal. El índice es negativo o mayor o igual que el tamaño de la matriz.
Así por ejemplo:
int[] array = new int[5];
int boom = array[10]; // Throws the exception
En cuanto a cómo evitarlo... um, no hagas eso. Tenga cuidado con los índices de su matriz.
Un problema con el que a veces se encuentra la gente es pensar que las matrices están indexadas en 1, por ejemplo
int[] array = new int[5];
// ... populate the array here ...
for (int index = 1; index <= array.length; index++)
{
System.out.println(array[index]);
}
Eso omitirá el primer elemento (índice 0) y generará una excepción cuando el índice sea 5. Los índices válidos aquí son del 0 al 4 inclusive. La declaración idiomática correcta for
aquí sería:
for (int index = 0; index < array.length; index++)
(Eso supone que necesita el índice, por supuesto. Si puede usar el bucle for mejorado, hágalo).
Básicamente:
if (index < 0 || index >= array.length) {
// Don't use this index. This is out of bounds (borders, limits, whatever).
} else {
// Yes, you can safely use this index. The index is present in the array.
Object element = array[index];
}
En su caso específico,
for (int i = 0; i<=name.length; i++)
el índice incluye la longitud de la matriz. Esto está fuera de límites. Necesitas reemplazar <=
por <
.
for (int i = 0; i < name.length; i++)
Ver también:
- Los tutoriales de Java - Conceptos básicos del lenguaje - Matrices
De este excelente artículo: ArrayIndexOutOfBoundsException en bucle for
Para decirlo brevemente:
En la última iteración de
for (int i = 0; i <= name.length; i++) {
i
será igual name.length
a cuál es un índice ilegal, ya que los índices de matriz tienen base cero.
Tu código debería leer
for (int i = 0; i < name.length; i++)
^
Significa que está intentando acceder a un índice de una matriz que no es válida porque no se encuentra entre los límites.
Por ejemplo, esto inicializaría una matriz de enteros primitiva con el límite superior 4.
int intArray[] = new int[5];
Los programadores cuentan desde cero. Entonces, esto, por ejemplo, arrojaría un ArrayIndexOutOfBoundsException
ya que el límite superior es 4 y no 5.
intArray[5];