O que causa ArrayIndexOutOfBoundsException
?
Se você pensa em uma variável como uma "caixa" onde pode colocar um valor, uma matriz é uma série de caixas colocadas próximas uma da outra, em que o número de caixas é um número inteiro finito e explícito.
Criando uma matriz como esta:
final int[] myArray = new int[5]
cria uma linha de 5 caixas, cada uma segurando um int
. Cada uma das caixas tem um índice, uma posição na série de caixas. Esse índice começa em 0 e termina em N-1, onde N é o tamanho da matriz (o número de caixas).
Para recuperar um dos valores dessa série de caixas, você pode consultá-lo através de seu índice, assim:
myArray[3]
O que fornecerá o valor da quarta caixa da série (já que a primeira caixa possui o índice 0).
Um ArrayIndexOutOfBoundsException
é causado pela tentativa de recuperar uma "caixa" que não existe, passando um índice maior que o índice da última "caixa" ou negativo.
No meu exemplo em execução, esses trechos de código produziriam uma exceção:
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 evitar ArrayIndexOutOfBoundsException
, há alguns pontos-chave a serem considerados:
Looping
Ao percorrer uma matriz, sempre verifique se o índice que você está recuperando é estritamente menor que o comprimento da matriz (o número de caixas). Por exemplo:
for (int i = 0; i < myArray.length; i++) {
Observe o <
, nunca misture um =
lá ..
Você pode querer ser tentado a fazer algo assim:
for (int i = 1; i <= myArray.length; i++) {
final int someint = myArray[i - 1]
Apenas não. Atenha-se ao indicado acima (se você precisar usar o índice) e isso poupará muita dor.
Sempre que possível, use foreach:
for (int value : myArray) {
Dessa forma, você não precisará pensar em índices.
Ao fazer o loop, faça o que fizer, NUNCA altere o valor do iterador do loop (aqui:) i
. O único lugar em que isso deve alterar o valor é manter o loop funcionando. Mudá-lo de outra maneira está apenas arriscando uma exceção e, na maioria dos casos, não é necessário.
Recuperação / atualização
Ao recuperar um elemento arbitrário da matriz, sempre verifique se é um índice válido em relação ao comprimento da 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];
}