Meu programa com arrays java não funciona

4 respostas Resolvido
javaarray
M

Olá, boa tarde ! Sou iniciante em Java, e no momento estou estudando sobre vetores/arrays. Fiz um pequeno programa para treinar o que aprendi, porém quando vou executar o programa sempre dá erro. Meu programa deve cadastrar os nomes dos alunos e suas respectivas notas:

package Aulas;

import java.util.Scanner;

public class aulajava {
	
	public static void main(String[] args) {
		//ARRAYS
		int quantalunos = 0;
		double[] notasalunos = new double[quantalunos];
		String[] nomesalunos = new String[quantalunos];
		
		Scanner input = new Scanner(System.in);
		
		System.out.println("Informe a quantidade de alunos: ");
		quantalunos = input.nextInt();
		
		for (int i = 0; i < quantalunos; i++) {
			System.out.println("------------------------------");
			System.out.println("Nome do aluno " + (i+1) + ": ");
			nomesalunos[i] = input.nextLine();
			System.out.println("Nota do aluno " + (i+1) + ": ");
			notasalunos[i] = input.nextInt();
		}
	}
}

OBS: o erro que aparece ao compilar é o seguinte:

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 0

Alguém saberia me dizer o que exatamente há de errado com o meu programa e o que devo fazer para corrigir ?

4 Respostas

G
Solucao aceita

Amigo, bom dia. Tudo bem?

Veja bem, antes de eu te explicar, tenha como verdade isso: Um vetor, quando instanciado, recebe a informação de qual vai ser seu tamanho - ter apenas um item, dois, três - e isso nunca se modifica, ou seja, se você disser que um vetor tem 3 posições, ele terá sempre 3 posições e o que você pode fazer é apenas editar o conteúdo de cada posição, sem poder adicionar mais posições.

Então, vamos lá.

No inicio do seu programa você cria uma variável “quantalunos” e indica que o valor dela é 0.

Em seguida, você cria um vetor chamado “notasalunos” e diz que a quantidade de posições que ele vai ter é a variável quantalunos, ou seja, 0. Sendo assim, nesse momento você tem um vetor com 0 posições.

Em seguida, você cria um vetor chamado nomesalunos e diz que a quantidade de posições que ele vai ter também é a variável quantalunos, ou seja, novamente 0 posições.

Então, você pede para o usuário informar a quantidade de alunos e diz que a variável quantalunos é o valor informado.

Vamos supor que o usuário informou 6. Sendo assim, a variável quantalunos agora vale 6.

Então, você faz um looping que a quantidade de vezes é o valor da variável quantalunos (que agora é igual ao valor que o usuário informou) ou seja, o loopping acontecerá 6 vezes.

A cada vez, você tenta pegar a posição do vetor i. Ou seja, Primeiro 0, depois 1, então 2, 3, 4, 5 e finalmente 6.

Acontece que o seu vetor não tem nenhuma dessas posições, pois quando você instânciou (criou ele) você indicou que o tamanho dele seria igual a variável quantalunos e, naquele momento, era 0.

Então o java te dá o erro de ArrayIndexOutOfBoundsException, que se você for até o google tradutor e traduzir, significa:
Índice de matriz fora dos limites de exceção.
Ou seja, o java te diz que a posição que você está tentando pegar está fora dos limites do vetor, que essa posição não existe.

Como solução, você pode instânciar os vetores depois de o usuário informar a quantidade de alunos, ou seja:

double[] notasalunos = new double[quantalunos];
String[] nomesalunos = new String[quantalunos];

após:

System.out.println("Informe a quantidade de alunos: ");
quantalunos = input.nextInt();

Abraços e boa sorte.

M

Oi Gustavo, usei sua solução no meu código, porém funcionou parcialmente. Agora meu programa está com outro erro, mas não em relação aos vetores e sim ao Scanner. Bom, como quero que o meu Scanner armazene o nome completo do aluno no vetor, e não apenas o primeiro nome, eu uso o nextLine(); só que quando vou executar dá erro. O código pula a parte em que eu iria digitar o nome do aluno e manda logo digitar a nota. Sabe me dizer porque isso acontece ?

for (int i = 0; i < quantalunos; i++){

System.out.println("------------------------------");

System.out.println("Nome do aluno " + (i+1) + ": ");

nomesalunos[i] = input.nextLine();          //O PROGRAMA PULA ESSA PARTE

System.out.println("Nota do aluno " + (i+1) + ": ");

notasalunos[i] = input.nextDouble();

}
I

Olá Matheus.

Vou tentar explicar com minhas palavras, o que acontece é o seguinte, quando você usa o método nextInt() na leitura da quantidade de alunos antes do nextLine(), você está lendo o inteiro e não a linha inteira. E na linha existe algo a mais do que o inteiro que você digitou. Então, logo que você pressiona enter para confirmar a quantidade de alunos, ele captura esse inteiro, e o nextLine() captura o enter e segui para a proximo next, que nesse caso é a nota do aluno. Por isso ele está passando direto.

Solução 1:

int quantalunos = 0;
				
				Scanner input = new Scanner(System.in);
				
				System.out.println("Informe a quantidade de alunos: ");
				quantalunos = input.nextInt();
				
				double[] notasalunos = new double[quantalunos];
				String[] nomesalunos = new String[quantalunos];
				
				for (Integer i = 0 ; i < quantalunos; i++) {
					System.out.println("------------------------------");
					System.out.println("Nome do aluno " + (i+1) + ": ");
					input.nextLine();
					nomesalunos[i] = input.nextLine();
					System.out.println("Nota do aluno " + (i+1) + ": ");
					notasalunos[i] = input.nextInt();
				}

Observe que adicionei uma linha a mais justamente para capturar aquele restante de linha quando você inseriu o inteiro. Mas isso não é nada elegante.

Solução 2:

int quantalunos = 0;
			
			Scanner input = new Scanner(System.in);
			
			System.out.println("Informe a quantidade de alunos: ");
			quantalunos = Integer.parseInt(input.nextLine());
			
			double[] notasalunos = new double[quantalunos];
			String[] nomesalunos = new String[quantalunos];
			
			for (Integer i = 0 ; i < quantalunos; i++) {
				System.out.println("------------------------------");
				System.out.println("Nome do aluno " + (i+1) + ": ");					
				nomesalunos[i] = input.nextLine();
				System.out.println("Nota do aluno " + (i+1) + ": ");
				notasalunos[i] = Double.parseDouble((input.nextLine()));
			}

Aconselho você sempre receber um nextLine() e fazer a conversão para o tipo especifico, conforme a sua necessidade.

Abraço e bons estudos amigo!!

M

Valeu pela ajuda ! Adicionei uma linha a mais no programa, como você sugeriu, e deu certo ! Estava batendo muita cabeça com isso, não imaginava que fosse tão simples. Obrigado pela explicação :+1:

Criado 20 de maio de 2020
Ultima resposta 22 de mai. de 2020
Respostas 4
Participantes 3