Cosa significa ArrayIndexOutOfBoundsException
e come me ne libero?
Ecco un esempio di codice che scatena l'eccezione:
String[] name = { "tom", "dick", "harry" };
for (int i = 0; i <= name.length; i++) {
System.out.println(name[i]);
}
Il vostro primo porto di chiamata dovrebbe essere la documentazione che lo spiega abbastanza chiaramente:
Lanciato per indicare che si è acceduto ad un array con un indice illegale. L'indice è negativo o maggiore o uguale alla dimensione dell'array.
Quindi, per esempio:
int[] array = new int[5];
int boom = array[10]; // Throws the exception
Per quanto riguarda come evitarlo... ehm, non fatelo. Fai attenzione agli indici dei tuoi array.
Un problema in cui la gente a volte incorre è pensare che gli array siano indicizzati a 1, ad es.
int[] array = new int[5];
// ... populate the array here ...
for (int index = 1; index <= array.length; index++)
{
System.out.println(array[index]);
}
Questo non terrà conto del primo elemento (indice 0) e lancerà un'eccezione quando l'indice è 5. Gli indici validi qui sono 0-4 inclusi. La corretta, idiomatica dichiarazione for
qui sarebbe:
for (int index = 0; index < array.length; index++)
(Questo supponendo che abbiate bisogno dell'indice, naturalmente. Se invece potete usare il ciclo for avanzato, fatelo).
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];
}
Aggiornamento: come da tuo frammento di codice,
for (int i = 0; i<=name.length; i++) {
L'indice è comprensivo della lunghezza dell'array. Questo è fuori dai limiti. Devi sostituire <=
con <
.
for (int i = 0; i < name.length; i++) {
Significa che state cercando di accedere a un indice di una matrice che non è valido perché non è tra i limiti.
Per esempio questo inizializzerebbe un array di interi primitivi con il limite superiore 4.
int intArray[] = new int[5];
I programmatori contano da zero. Quindi questo per esempio lancerebbe una ArrayIndexOutOfBoundsException
perché il limite superiore è 4 e non 5.
intArray[5];