¿Qué ArrayIndexOutOfBoundsException
significa y cómo me deshago de él?
Aquí hay una muestra 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]);
}
i <= name.length
coni < name.length
- o mejor, escriba un bucle for mejorado. (for (String aName : name) { ... }
)Respuestas:
Su primer puerto de escala debe ser la documentación que lo explica razonablemente claro:
Así por ejemplo:
En cuanto a cómo evitarlo ... um, no hagas eso. Tenga cuidado con sus índices de matriz.
Un problema con el que la gente a veces se encuentra es pensar que las matrices están indexadas en 1, por ejemplo
Eso perderá el primer elemento (índice 0) y generará una excepción cuando el índice sea 5. Los índices válidos aquí son 0-4 inclusive. La
for
declaración correcta e idiomática aquí sería:(Eso supone que necesita el índice, por supuesto. Si puede utilizar el bucle for mejorado, hágalo).
fuente
for (int nestedIndex = 0; nestedIndex < array[outerIndex].length; nestedIndex++) { ... array[outerIndex][nestedIndex] ... }
.Ver también:
Actualización : según su fragmento de código,
El índice incluye la longitud de la matriz. Esto está fuera de los límites. Necesitas reemplazar
<=
por<
.fuente
De este excelente artículo: ArrayIndexOutOfBoundsException en for loop
Para decirlo brevemente:
En la última iteración de
i
será igual aname.length
un índice ilegal, ya que los índices de matriz están basados en cero.Tu código debería leer
fuente
Significa que está intentando acceder a un índice de una matriz que no es válida ya que no está entre los límites.
Por ejemplo, esto inicializaría una matriz entera primitiva con el límite superior 4.
Los programadores cuentan desde cero. Entonces, por ejemplo, arrojaría un
ArrayIndexOutOfBoundsException
como el límite superior es 4 y no 5.fuente
Para evitar una excepción de índice de matriz fuera de límites, se debe usar la instrucción mejorada
for
dónde y cuándo pueden.La motivación principal (y el caso de uso) es cuando está iterando y no requiere pasos de iteración complicados. Se podría no ser capaz de utilizar un enhanced-
for
para mover hacia atrás en una matriz o solamente iterar sobre todos los demás elementos.Se garantiza que no se quedará sin elementos para iterar al hacer esto, y su ejemplo [corregido] se convierte fácilmente.
El código a continuación:
... es equivalente a esto:
fuente
¿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:
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í:
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:
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:
Observe el
<
, nunca mezcle un=
allí.Es posible que desee tener la tentación de hacer algo como esto:
Solo no lo hagas. Apéguese al anterior (si necesita usar el índice) y le ahorrará mucho dolor.
Donde sea posible, use foreach:
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:
fuente
En su código, ha accedido a los elementos desde el índice 0 hasta la longitud de la matriz de cadenas.
name.length
da el número de objetos de cadena en su matriz de objetos de cadena, es decir, 3, pero solo puede acceder hasta el índice 2name[2]
, porque se puede acceder a la matriz desde el índice 0 hastaname.length - 1
donde obtiene elname.length
número de objetos.Incluso mientras usa un
for
bucle, ha comenzado con el índice cero y debe terminar conname.length - 1
. En una matriz a [n] puede acceder desde [0] a a [n-1].Por ejemplo:
En tu caso:
fuente
Para su matriz dada, la longitud de la matriz es 3 (es decir, name.length = 3). Pero como almacena el elemento a partir del índice 0, tiene el índice máximo 2.
Entonces, en lugar de 'i ** <= name.length', debe escribir 'i <** name.length' para evitar 'ArrayIndexOutOfBoundsException'.
fuente
Esto en cuanto a esta simple pregunta, pero solo quería destacar una nueva característica en Java que evitará todas las confusiones sobre la indexación en matrices, incluso para principiantes. Java-8 ha abstraído la tarea de iterar para usted.
Cual es el beneficio? Bueno, una cosa es la legibilidad como el inglés. En segundo lugar, no necesita preocuparse por el
ArrayIndexOutOfBoundsException
fuente
Usted se
ArrayIndexOutOfBoundsException
debe debido ai<=name.length
parte.name.length
devuelve la longitud de la cadenaname
, que es 3. Por lo tanto, cuando intenta accedername[3]
, es ilegal y produce una excepción.Código resuelto:
Está definido en la especificación del lenguaje Java :
fuente
Así es como se ve este tipo de excepción cuando se lanza en Eclipse. El número en rojo significa el índice al que intentó acceder. Entonces el código se vería así:
El error se produce cuando intenta acceder a un índice que no existe en esa matriz. Si una matriz tiene una longitud de 3,
entonces los únicos índices válidos son:
Si una matriz tiene una longitud de 1,
entonces el único índice válido es:
Cualquier número entero igual a la longitud de la matriz, o más grande que él: está fuera de los límites.
Cualquier número entero menor que 0: está fuera de los límites;
PD: Si busca comprender mejor las matrices y hacer algunos ejercicios prácticos, aquí hay un video: tutorial sobre matrices en Java
fuente
Para las matrices multidimensionales, puede ser complicado asegurarse de acceder a la
length
propiedad de la dimensión correcta. Tome el siguiente código, por ejemplo:Cada dimensión tiene una longitud diferente, por lo que el error sutil es que los bucles medio e interno usan la
length
propiedad de la misma dimensión (porquea[i].length
es lo mismo quea[j].length
).En cambio, el bucle interno debe usar
a[i][j].length
(oa[0][0].length
, por simplicidad).fuente
El caso más común que he visto para ArrayIndexOutOfBoundsExceptions aparentemente misteriosas, es decir, aparentemente no causado por su propio código de manejo de matriz, es el uso simultáneo de SimpleDateFormat. Particularmente en un servlet o controlador:
Si dos hilos ingresan el método SimplateDateFormat.parse () juntos, probablemente verá una excepción ArrayIndexOutOfBoundsException. Tenga en cuenta la sección de sincronización de la clase javadoc para SimpleDateFormat .
Asegúrese de que no haya lugar en su código que esté accediendo a clases inseguras de subprocesos como SimpleDateFormat de manera concurrente como en un servlet o controlador. Verifique todas las variables de instancia de sus servlets y controladores para detectar posibles sospechosos.
fuente
ArrayIndexOutOfBoundsException siempre que se presente esta excepción, significa que está tratando de usar un índice de matriz que está fuera de sus límites o en términos simples que está solicitando más de lo que ha inicializado.
Para evitar esto, asegúrese siempre de que no está solicitando un índice que no está presente en la matriz, es decir, si la longitud de la matriz es 10, entonces su índice debe oscilar entre 0 y 9
fuente
ArrayIndexOutOfBounds significa que está intentando indexar una posición dentro de una matriz que no está asignada.
En este caso:
Para evitar esto ...
En su bucle for, puede hacer i <name.length. Esto evitaría bucles al nombre [3] y en su lugar se detendría en el nombre [2]
for(int i = 0; i<name.length; i++)
Use a para cada bucle
String[] name = { "tom", "dick", "harry" }; for(String n : name) { System.out.println(n); }
Use list.forEach (Acción del consumidor) (requiere Java8)
String[] name = { "tom", "dick", "harry" }; Arrays.asList(name).forEach(System.out::println);
Convertir matriz a transmisión: esta es una buena opción si desea realizar 'operaciones' adicionales a su matriz, por ejemplo, filtrar, transformar el texto, convertir a un mapa, etc. (requiere Java8)
String[] name = { "tom", "dick", "harry" }; --- Arrays.asList(name).stream().forEach(System.out::println); --- Stream.of(name).forEach(System.out::println);
fuente
ArrayIndexOutOfBoundsException
significa que está intentando acceder a un índice de la matriz que no existe o está fuera del límite de esta matriz. Los índices de matriz comienzan desde 0 y terminan en longitud - 1 .En tu caso
ArrayIndexOutOfBoundsException
sucede cuando intenta acceder al elemento indexado name.length que no existe (el índice de matriz termina en longitud -1). simplemente reemplazando <= con <resolvería este problema.fuente
Para cualquier matriz de longitud n, los elementos de la matriz tendrán un índice de 0 a n-1.
Si su programa está intentando acceder a cualquier elemento (o memoria) que tenga un índice de matriz mayor que n-1, entonces Java arrojará ArrayIndexOutOfBoundsException
Aquí hay dos soluciones que podemos usar en un programa
Recuento de mantenimiento:
O alguna otra declaración de bucle como
Una mejor manera de ir con un para cada bucle, en este método, un programador no tiene necesidad de preocuparse por el número de elementos en la matriz.
fuente
De acuerdo a su código:
Si marca System.out.print (name.length);
obtendrás 3;
eso significa que la longitud de tu nombre es 3
su bucle se ejecuta de 0 a 3, que debería ejecutar "0 a 2" o "1 a 3"
Responder
fuente
Cada elemento de una matriz se llama elemento y se accede a cada elemento por su índice numérico. Como se muestra en la ilustración anterior, la numeración comienza con 0 . Por lo tanto, se accedería al noveno elemento, por ejemplo, en el índice 8.
IndexOutOfBoundsException se genera para indicar que un índice de algún tipo (como una matriz, una cadena o un vector) está fuera de rango.
Se puede acceder a cualquier matriz X desde [0 a (X.length - 1)]
fuente
Veo todas las respuestas aquí explicando cómo trabajar con matrices y cómo evitar las excepciones de índice fuera de límites. Yo personalmente evito las matrices a toda costa. Utilizo las clases de Colecciones, lo que evita toda la tontería de tener que lidiar con los índices de matriz por completo. Las construcciones de bucle funcionan maravillosamente con colecciones que soportan código que es más fácil de escribir, comprender y mantener.
fuente
Si usa la longitud de una matriz para controlar la iteración de un bucle for , recuerde siempre que el índice del primer elemento de una matriz es 0 . Entonces, el índice del último elemento en una matriz es uno menos que la longitud de la matriz.
fuente
ArrayIndexOutOfBoundsException
El nombre mismo explica que si intenta acceder al valor en el índice que está fuera del alcance del tamaño de la matriz, se produce ese tipo de excepción.En su caso, puede eliminar el signo igual del bucle for.
La mejor opción es iterar una matriz:
fuente
Este error se produce en tiempos de límite excesivos del ciclo de ejecución. Consideremos un ejemplo simple como este,
Al principio, he inicializado una matriz como 'numberArray'. luego, algunos elementos de la matriz se imprimen usando for loop. Cuando el ciclo está ejecutando el tiempo 'i', imprima el elemento (númeroArray [i + 1] .. (cuando el valor de i es 1, se imprime el elemento numberArray [i + 1]). Suponga que, cuando i = (númeroArray. longitud-2), se imprime el último elemento de la matriz ... Cuando el valor 'i' va a (númeroArray.length-1), no hay valor para imprimir ... En ese punto, se produce 'ArrayIndexOutOfBoundsException'. Espero que pueda obtener idea.gracias!
fuente
Puede usar Opcional en estilo funcional para evitar
NullPointerException
yArrayIndexOutOfBoundsException
:Salida:
fuente
No podría iterar o almacenar más datos que la longitud de su matriz. En este caso, podrías hacer así:
O esto:
fuente