Erro de ultrapassar quantidades de arrays : ArrayIndexOutOfBoundsException: Index 10 ou of bounds for length 10

Olá galera, estou enganchado nesse código. O intuito é analisar as posições do vetor e identificar se existe algum número par, caso haja, para o código.
A geração do código aleatório foi opcional meu, sei que poderia usar o método Scanner ou já criar o vetor no próprio código, mas gostaria de tentar dessa forma.
O código não apresenta erro na IDE Eclipse durante a construção, somente ao executá-lo, visto que é no momento de criação do vetor, faz sentido que somente erre na execução.
Li outro tópico e vi que esse problema acontece quando se utilizar “<=” no for, mas como o meu não tem, abri outro tópico.

Desde já, agradeço a ajuda.

import java.util.Random;

public class Exer23 {

public static void main(String[] args) {
	
	int vetorA[] = new int [10];
	int count = 0;
	boolean verificarPar = false;
	int countPrint = 0;
	int countW = 0;
	
	Random gerarAleatorio = new Random();
	
	for(count = 0; count < vetorA.length; count++);{
		vetorA[count] = gerarAleatorio.nextInt(2500);	
	}
	
	for (countPrint = 0; countPrint<vetorA.length; countPrint++) {
		System.out.println("No índice " + countPrint + " o vetor gerado foi: " + vetorA[countPrint]);
	}
	
	while(countW < vetorA.length && !verificarPar) {
		
		if(vetorA[countW] % 2 == 0) {
			verificarPar = true;
		}else {
			verificarPar = false;
			countW++;
		}
	}
	System.out.println("O vetor no qual parou de analisar foi: " + vetorA[countW] + " do índice: " + countW);

}

}

1 curtida

Na verdade o erro está no primeiro for onde você colocou um ; no lugar errado. Por isso está dando ArrayIndexOutOfBoundsException.

*Coloque assim tirando o ; que resolve o problema:

for(count = 0; count < vetorA.length; count++) {
vetorA[count] = gerarAleatorio.nextInt(2500);
}

2 curtidas

Além disso:

  1. Procure declarar as variáveis no ponto mais próximo possível de onde for utiliza-las, não tudo no inicio. No caso de for, elas podem até ser declaradas dentro do for:

for (int count=0; count < vetor.length; count++)

  1. É possível interromper um for imediatamente com o comando break. Isso pode simplificar seu último for

  2. Revise a lógica do local onde o vetor parou. Ela está errada.

1 curtida

Só pra explicar de forma mais detalhada, no primeiro for tem um ; sobrando:

//                                           aqui
//                                            ▼
for(count = 0; count < vetorA.length; count++);{
    vetorA[count] = gerarAleatorio.nextInt(2500);   
}

Basicamente, esse ; faz com que o for fique “vazio”, sem nada dentro dele. E o que vem a seguir acaba sendo um bloco independente, que é executado apenas uma vez.

Faça o teste, o código abaixo imprime “oi” apenas uma vez:

for (int count = 0; count < 1000; count++);{
    System.out.println("oi"); // vai imprimir apenas uma vez
}

Isso porque o ; depois do for faz com que dentro do for não tenha nada. É basicamente isso:

// ter um ; depois do for é o mesmo que ter um bloco vazio
// por isso os dois loops abaixo são equivalentes (ambos não fazem nada)
for (int count = 0; count < 1000; count++);
for (int count = 0; count < 1000; count++) {
}

// o próximo bloco é independente, não faz parte do for
{
    System.out.println("oi");
}

E o que vem a seguir é um bloco “solto”, independente, que não faz parte do for. Apesar de não ser muito comum, é um código perfeitamente válido, que compila e roda sem problemas.

No seu caso, então temos um for que não faz nada, e ao final dele o valor de count será 10. A seguir, temos o bloco independente, que tenta acessar a posição 10 do array. Mas como as posições dele vão de 0 a 9, dá o erro.


Mas não para por aí. O que acontece se o array só tiver números ímpares? Ele vai incrementar countW até que o valor seja 10, e ao tentar imprimir a mensagem final, vai tentar acessar esta posição e dará erro do mesmo jeito.

O correto é imprimir a mensagem somente se foi encontrado um número par. Também dá pra simplificar os dois primeiros loops, não precisa de um pra gerar os números e outro pra imprimir.

E como já disseram, não precisa declarar todas as variáveis no início, isso é uma prática que fazia sentido há algumas décadas, mas hoje o recomendado é declarar o mais próximo de onde são usadas (isso também ajuda a delimitar o escopo).

Ou seja, poderia ser:

int vetorA[] = new int[10];
Random gerarAleatorio = new Random();
for (int i = 0; i < vetorA.length; i++) {
    // dá pra gerar e imprimir no mesmo loop
    vetorA[i] = gerarAleatorio.nextInt(2500);
    System.out.printf("No índice %d o valor gerado foi: %d\n", i, vetorA[i]);
}

int indicePar = -1;
for (int i = 0; i < vetorA.length; i++) {
    if (vetorA[i] % 2 == 0) {
        indicePar = i;
        break; // se já achei, interrompe o for
    }
}

// imprime a mensagem de acordo com o resultado
if (indicePar >= 0) {
    System.out.printf("Foi encontrado o número par %d no índice %d\n", vetorA[indicePar], indicePar);
} else {
    System.out.println("Nenhum número par encontrado");
}

E também daria pra fazer tudo no mesmo loop, basta adaptar um pouco a lógica:

int vetorA[] = new int[10];
Random gerarAleatorio = new Random();
int indicePar = -1;
for (int i = 0; i < vetorA.length; i++) {
    vetorA[i] = gerarAleatorio.nextInt(2500);
    if (indicePar == -1 && vetorA[i] % 2 == 0) { // se o número é par e ainda não foi encontrado nenhum
        indicePar = i;
    }
    System.out.printf("No índice %d o valor gerado foi: %d\n", i, vetorA[i]);
}

// imprime a mensagem de acordo com o resultado
if (indicePar >= 0) {
    System.out.printf("Foi encontrado o número par %d no índice %d\n", vetorA[indicePar], indicePar);
} else {
    System.out.println("Nenhum número par encontrado");
}
1 curtida

Era só isso mesmo.
A gente vai lendo e relendo, uma hora cega.
Muito obrigado.

Essa da variável dentro já me foi dito, mas por gosto próprio gosto que fica tudo junto lá em cima, talvez no futuro, com códigos maiores me atrapalhe. Já vou me adaptando logo dessa forma que você falou.

A questão do comando break simplificaria sim, inclusive tinha testado somente para ter o aprendizado, mas o código em questão é de um exercício, e nele tem um requisito para que não utilizemos o break.

Na lógica, funcionou. Poderia me dizer qual o erro?
Se o “if” é verdadeiro, declara “true”, ao rodar o loop, “!verificaPar” nega o boolean, que o torna “true”, que encerra o loop. No caso de o “if” ser falso, ele declara “false”, ao rodar o loop, “!verificarPar” considera “true”, então continua o loop.
Confesso que nesses boolean eu demoro mais pra assimilar que coisas mais difíceis, mas para mim estava correto.

Caramba, que massa!
Muito obrigado pela explicação tão detalhada. Abriu a mente.
Faz total sentido a simplificação que você propôs.