Erro de exercicio sobre arrays

A questão pede para criar um algoritmo que leia 05 nomes , 05 notas e exiba a media .
Criei uma variavel nome para classe String para armazenar os nomes na array bem como uma variavel tipo double para armazenar as notas chamadas notas, uma tipo double para armazenar a soma e outra tipo double para armazenar a media da turma.
Em seguida criei um laço usando a estrutura for para informar os nomes, notas e fazer a soma.
A variável media coloquei fora do laço que exibiria a media da turma .
O problema é que após o segundo looping o algoritmo apresenta um erro. Segue o código…

package listadexercicios;

import java.util.Scanner;

/*
Lê 5 nomes e notas de uma turma, 
calcula e exibe a média das notas da turma 
 */
public class Questao26 {

	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String[] nomes = new String[5];
		double[] notas = new double[5];
		double media=0, soma = 0;

		for (int c = 0; c < nomes.length; c++) {
			System.out.println("Informe um nome:");
			nomes[c] = input.nextLine();
			System.out.println("Informe a nota:");
			notas[c] = input.nextDouble();
			soma = soma + notas[c];

		}
		media = soma / 5;
		System.out.println("A media da turma é: " + media);

	}

}

Informe um nome:
a
Informe a nota:
5
Informe um nome:
Informe a nota:
a
Exception in thread "main" java.util.InputMismatchException
	at java.base/java.util.Scanner.throwFor(Scanner.java:939)
	at java.base/java.util.Scanner.next(Scanner.java:1594)
	at java.base/java.util.Scanner.nextDouble(Scanner.java:2564)
	at listadexercicios.Questao26.main(Questao26.java:21)

Alguem poderia me ajudar?

1 curtida

O erro que está acontecendo é porque ao usar input.nextLine() o programa vai pedir nome e nota juntos e consequentemente você deveria colocar somente o valor da nota o nome neste caso fica armazenando uma String vazia. Como resolver? segue abaixo…

Crie uma variável do tipo String e outra do tipo double fora do loop para você usar como auxiliares.
no lugar de input.nextLine() use somente input.next() e as variáveis auxiliares que você criar
coloque-as para receber os valores que forem informados pelo usuário.
exemplo:

String aux;
double notaAtual;
for (int i = 0; i < nomes.length; i++) {

        System.out.println("Informe um nome:");
        aux = input.next();
        nomes[i] = aux;
        System.out.println("Informe uma nota:");
        notaAtual = input.nextDouble();
        notas[i] = notaAtual;

        soma += notas[i];
    }
    media += soma/5;
    System.out.print("A média da turma é: "+media);

Espero ter ajudado! Bom estudo.

1 curtida

@Raphael_Junior muito obrigado pela explicação , não sabia que ao usar o nextLine() o programa pediria nome e nota consequentemente , isso realmente aconteceu só não conseguia entender o porquê. Mais uma vez muito obrigado!!

1 curtida

Tem um problema em usar next(). Por exemplo, se o nome tiver espaços, como “Fulano de Tal”, o next() só irá ler “Fulano” e depois nextDouble() vai tentar converter o “de” para número e vai dar erro, veja.


O problema do seu código foi misturar nextLine() com nextDouble(). O que acontece é que ao digitar ENTER, o buffer de entrada recebe um caractere de quebra de linha (o famoso \n), e existem métodos do Scanner que não consomem a quebra de linha (como é o caso do nextDouble()). Já outros como nextLine() consomem a quebra de linha.

Então o que acontece com o seu código é:

  • nextLine() lê o nome e consome a quebra de linha
  • nextDouble() lê a nota, mas não consome a quebra de linha
  • na próxima iteração, nextLine() consome a quebra de linha que nextDouble não leu (e como só tem a quebra de linha, o resultado é uma string vazia - com isso o nome ficará vazio)

Aqui uma explicação bem detalhada sobre esse tipo de problema (sugiro ler depois, com calma porque é um texto longo, mas que explica em detalhes porque isso acontece).


Enfim, no seu caso, você está lendo entradas do teclado e pedindo para digitar um dado de cada vez. Sendo assim, o melhor é sempre consumir a linha toda (inclusive a quebra de linha). E como nextDouble() não consome a quebra de linha, é melhor trocar tudo para nextLine(), e aí você converte a string para número. Assim:

for (int c = 0; c < nomes.length; c++) {
    System.out.println("Informe um nome:");
    nomes[c] = input.nextLine();
    System.out.println("Informe a nota:");
    // AQUI: nextLine consome a linha toda, e depois vc converte a string para double
    notas[c] = Double.parseDouble(input.nextLine());
    soma = soma + notas[c];
}

Dessa forma, você elimina o problema que ocorre se usar next() (agora os nomes podem ter espaços sem problemas, veja).

1 curtida

@hugokotsubo muito obrigado por esta explicação !!