que index error arrayindexoutofboundsexception java arrays indexoutofboundsexception

error - java.lang.indexoutofboundsexception index 0 size 0



¿Qué causa una java.lang.ArrayIndexOutOfBoundsException y cómo puedo prevenirlo? (22)

ArrayIndexOutOfBoundsException siempre que venga 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, 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, su índice debe estar entre 0 y 9

¿Qué significa ArrayIndexOutOfBoundsException y cómo me deshago de él?

Aquí hay un ejemplo de código que activa la excepción:

String[] name = {"tom", "dick", "harry"}; for(int i = 0; i<=name.length; i++) { System.out.print(name[i] +''/n''); }


Cada elemento de una matriz se denomina 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 . El noveno elemento, por ejemplo, sería accedido en el índice 8.

Se lanza la excepción IndexOutOfBoundsException 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, de [0 a (X.length - 1)]


El caso más común que he visto para aparentemente misteriosas ArrayIndexOutOfBoundsExceptions, es decir, aparentemente no es causado por su propio código de manejo de matriz, es el uso concurrente de SimpleDateFormat. Particularmente en un servlet o controlador:

public class MyController { SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); public void handleRequest(ServletRequest req, ServletResponse res) { Date date = dateFormat.parse(req.getParameter("date")); } }

Si dos subprocesos ingresan juntos al método SimplateDateFormat.parse (), es probable que vea una ArrayIndexOutOfBoundsException. Tenga en cuenta la sección de sincronización de la clase javadoc para SimpleDateFormat .

Asegúrese de que no haya ningún lugar en su código que acceda a las 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.


En su código, ha accedido a los elementos desde el índice 0 hasta la longitud de la matriz de cadenas. name.length proporciona el número de objetos de cadena en su matriz de objetos de cadena, es decir, 3, pero solo puede acceder hasta el name[2] índice 2 name[2] , ya que se puede acceder a la matriz desde el índice 0 al name.length - 1 donde obtiene name.length número de objetos.

Incluso mientras usa un bucle for , ha comenzado con el índice cero y debe terminar con name.length - 1 . En una matriz a [n] puede acceder desde [0] a [n-1].

Por ejemplo:

String[] a={"str1", "str2", str3" ..., "strn"}; for(int i=0;i<a.length()i++) System.out.println(a[i]);

En tu caso:

String[] name = {"tom", "dick", "harry"}; for(int i = 0; i<=name.length; i++) { System.out.print(name[i] +''/n''); }


Este error se produce en los ciclos de ejecuciones por encima del límite. Veamos un ejemplo simple como este.

class demo{ public static void main(String a[]){ int[] numberArray={4,8,2,3,89,5}; int i; for(i=0;i<numberArray.length;i++){ System.out.print(numberArray[i+1]+" "); } }

Al principio, he inicializado una matriz como ''numberArray''. luego, algunos elementos de la matriz se imprimen usando for loop. Cuando el bucle ejecuta el tiempo ''i'', imprima el elemento (numberArray [i + 1] .. (cuando el valor de i es 1, se imprime el elemento numberArray [i + 1]). Supongamos que, cuando i = (numberArray. longitud-2), el último elemento de la matriz se imprime ... Cuando el valor ''i'' va a (numberArray.length-1), no se imprime ningún valor ... En ese punto, se produce ''ArrayIndexOutOfBoundsException''. Espero que pueda obtener idea.gracias!


Esto significa que está intentando acceder a un índice de una matriz que no es válido ya que no está entre los límites.

Por ejemplo, esto inicializaría una matriz de enteros primitivos con el límite superior 4.

int intArray[] = new int[5];

Los programadores cuentan desde cero. Entonces, por ejemplo, esto arrojaría una ArrayIndexOutOfBoundsException ya que el límite superior es 4 y no 5.

intArray[5];


Mucho para esta simple pregunta, pero solo quería resaltar una nueva característica en Java que evitará todas las confusiones acerca de la indexación en matrices, incluso para principiantes. Java-8 ha abstraído la tarea de iterar para usted.

int[] array = new int[5]; //If you need just the items Arrays.stream(array).forEach(item -> { println(item); }); //If you need the index as well IntStream.range(0, array.length).forEach(index -> { println(array[index]); })

¿Cuál es el beneficio? Bueno, una cosa es la legibilidad como el inglés. En segundo lugar, no debe preocuparse por la ArrayIndexOutOfBoundsException


No podría iterar o almacenar más datos que la longitud de su matriz. En este caso podrías hacer esto:

for (int i = 0; i <= name.length - 1; i++) { // .... }

O esto:

for (int i = 0; i < name.length; i++) { // ... }


Para decirlo brevemente:

En la última iteración de

for(int i = 0; i<=name.length; i++) {

name.length que es un índice ilegal, ya que los índices de matriz están basados ​​en cero.

Tu código debería leer

for(int i = 0; i < name.length; i++) ^


Para evitar una excepción fuera del límite del índice de matriz, uno debe usar la declaración enhanced-for donde y cuando pueda.

La motivación principal (y el caso de uso) es cuando está iterando y no requiere pasos de iteración complicados. No sería capaz de usar un mejorado for moverse hacia atrás en una matriz o solo iterar en cualquier otro elemento.

Se le garantiza que no se quedará sin elementos para iterar al hacer esto, y su ejemplo [corregido] se puede convertir fácilmente.

El siguiente código:

String[] name = {"tom", "dick", "harry"}; for(int i = 0; i< name.length; i++) { System.out.print(name[i] + "/n"); }

... es equivalente a esto:

String[] name = {"tom", "dick", "harry"}; for(String firstName : name) { System.out.println(firstName + "/n"); }


Para matrices multidimensionales, puede ser difícil asegurarse de que se accede a la propiedad de length de la dimensión correcta. Toma el siguiente código por ejemplo:

int [][][] a = new int [2][3][4]; for(int i = 0; i < a.length; i++){ for(int j = 0; j < a[i].length; j++){ for(int k = 0; k < a[j].length; k++){ System.out.print(a[i][j][k]); } System.out.println(); } System.out.println(); }

Cada dimensión tiene una longitud diferente, por lo que el error sutil es que los bucles medio e interno utilizan la propiedad de length de la misma dimensión (porque a[i].length length a[i].length Es la misma que a[j].length .).

En su lugar, el bucle interno debe usar a[i][j].length (o a[0][0].length , por simplicidad).


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.

Por lo tanto, en lugar de ''i ** <= name.length'' debe escribir ''i <** name.length'' para evitar ''ArrayIndexOutOfBoundsException''.


Según su Código:

String[] name = {"tom", "dick", "harry"}; for(int i = 0; i<=name.length; i++) { System.out.print(name[i] +''/n''); }

Si marca System.out.print (name.length);

obtendrá 3;

eso significa que la longitud de tu nombre es 3

su bucle se ejecuta de 0 a 3, que debería estar ejecutando "0 a 2" o "1 a 3"

Responder

String[] name = {"tom", "dick", "harry"}; for(int i = 0; i<name.length; i++) { System.out.print(name[i] +''/n''); }


Su primer puerto de escala debe ser la documentation que lo explique de manera razonablemente clara:

Se lanza para indicar que se ha accedido a una matriz con un índice no válido. El índice es negativo, 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 que la gente a veces encuentra es pensar que los arrays están indexados por 1

int[] array = new int[5]; // ... populate the array here ... for (int index = 1; index <= array.length; index++) { System.out.println(array[index]); }

Eso perderá el primer elemento (índice 0) y lanzará una excepción cuando el índice sea 5. Los índices válidos aquí son 0-4 inclusive. El correcto, idiomático for declaración aquí sería:

for (int index = 0; index < array.length; index++)

(Eso es asumiendo que necesita el índice, por supuesto. Si puede usar el bucle for for en su lugar, hágalo).


Veo todas las respuestas aquí explicando cómo trabajar con matrices y cómo evitar las excepciones del índice fuera de límites. Personalmente evito los arreglos a toda costa. Utilizo las clases de Colecciones, que evitan toda la estupidez de tener que lidiar con los índices de matriz por completo. Las construcciones en bucle funcionan a la perfección con colecciones que admiten códigos que son más fáciles de escribir, comprender y mantener.


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í:

myArray[5]

El error se produce cuando intenta acceder a un índice que no existe en esa matriz. Si una matriz tiene una longitud de 3,

int[] intArray = new int[3];

entonces los únicos índices válidos son:

intArray[0] intArray[1] intArray[2]

Si una matriz tiene una longitud de 1,

int[] intArray = new int[1];

entonces el único índice válido es:

intArray[0]

Cualquier número entero igual a la longitud de la matriz, o mayor que él: está fuera de límites.

Cualquier entero menor que 0: está fuera de límites;

PD: si desea tener una mejor comprensión de los arreglos y hacer algunos ejercicios prácticos, aquí hay un video: tutorial sobre arreglos en Java.


ArrayIndexOutOfBoundsException debido a i<=name.length part. name.length devuelve la longitud del name de la cadena, que es 3. Por lo tanto, cuando intenta acceder al name[3] , es ilegal y lanza una excepción.

Código resuelto:

String[] name = {"tom", "dick", "harry"}; for(int i = 0; i < name.length; i++) { //use < insteadof <= System.out.print(name[i] +''/n''); }

Se define en la especificación del lenguaje Java :

La length campo public final , que contiene el número de componentes de la matriz. length puede ser positiva o cero.


ArrayIndexOutOfBoundsException nombre de ArrayIndexOutOfBoundsException explica que si intenta acceder al valor en el índice que está fuera del alcance del tamaño de la matriz, se produce este tipo de excepción.

En su caso, puede eliminar el signo igual de su bucle for.

for(int i = 0; i<name.length; i++)

La mejor opción es iterar una matriz:

for(String i : name ) System.out.println(i);


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 matrices comienzan desde 0 y terminan en longitud - 1 .

En tu caso

for(int i = 0; i<=name.length; i++) { System.out.print(name[i] +''/n''); // i goes from 0 to length, Not correct }

ArrayIndexOutOfBoundsException ocurre cuando intenta acceder al elemento indexado name.length que no existe (el índice de la matriz termina en la longitud -1). simplemente reemplazando <= con <resolvería este problema.

for(int i = 0; i < name.length; i++) { System.out.print(name[i] +''/n''); // i goes from 0 to length - 1, Correct }


¿Qué causa ArrayIndexOutOfBoundsException ?

Si piensa en una variable como un "cuadro" donde puede colocar un valor, entonces una matriz es una serie de cuadros colocados uno junto al otro, donde el número de cuadros es un entero finito y explícito.

Creando 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 cuadros).

Para recuperar uno de los valores de esta serie de cuadros, puede referirse a él a través de su índice, como este:

myArray[3]

Lo que le dará el valor del cuarto cuadro de la serie (ya que el primer cuadro tiene un índice 0).

Una ArrayIndexOutOfBoundsException se produce al intentar recuperar una "caja" que no existe, al pasar un índice que es más alto que el índice de la última "caja", o negativo.

Con mi ejemplo de ejecución, estos fragmentos de código producirían tal 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

Cómo evitar ArrayIndexOutOfBoundsException

Para evitar ArrayIndexOutOfBoundsException , hay algunos puntos clave a considerar:

Bucle

Cuando recorra una matriz, asegúrese siempre de que el índice que está recuperando sea estrictamente más pequeño que la longitud de la matriz (el número de cuadros). Por ejemplo:

for (int i = 0; i < myArray.length; i++) {

Observe que < , nunca mezcle a = 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]

Simplemente no Apégate a la anterior (si necesitas usar el índice) y te ahorrará mucho dolor.

Donde sea posible, use foreach:

for (int value : myArray) {

De esta manera no tendrás que pensar en índices en absoluto.

Cuando realice un bucle, haga lo que haga, NUNCA cambie el valor del iterador de bucle (aquí: i ). El único lugar donde debería cambiar el valor es mantener el bucle en marcha. Cambiarlo de otro modo es solo arriesgar una excepción, y en la mayoría de los casos no es necesario.

Recuperación / actualización

Cuando recupere un elemento arbitrario de la matriz, siempre verifique que sea un índice válido con respecto a 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]; }


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 lanzará ArrayIndexOutOfBoundsException

Así que aquí hay dos soluciones que podemos usar en un programa.

  1. Mantener el recuento:

    for(int count = 0; count < array.length; count++) { System.out.println(array[count]); }

    O alguna otra declaración en bucle como

    int count = 0; while(count < array.length) { System.out.println(array[count]); count++; }

  2. Una mejor manera de ir con un bucle para cada bucle, en este método, un programador no tiene necesidad de preocuparse por la cantidad de elementos en la matriz.

    for(String str : array) { System.out.println(str); }


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]; }

Ver también:

Actualización : según su fragmento de código,

for(int i = 0; i<=name.length; i++) {

El índice incluye la longitud de la matriz. Esto está fuera de los límites. Necesitas reemplazar <= por < .

for(int i = 0; i < name.length; i++) {