Error Loop Java Class Scanner

5

When I use the nextLine () method in place of next () in the code below, code interactions are skipped and some fields are left blank.

import java.util.Scanner;
public class turma {

    public static void main (String args[]) {
        final byte tamanho=10;
        byte k=tamanho;
        Scanner entrada=new Scanner(System.in);
        float notas[][]=new float[tamanho][3];// A matriz possui 10 linhas e três colunas(uma para cada prova e a última para a média);
        String nomes[][]=new String[tamanho][2];//A matriz possui 10 linhas (alunos) e duas colunas, uma para o nome e a outra para a situação
        System.out.println("Cadastro de Turma:");
        for (byte i=0; i<=(k-1); i++) { //laço para as linhas
                System.out.println("Entre com o nome do "+(i+1)+"º aluno:");
                //entrada.nextLine();
                nomes[i][0]=entrada.nextLine();

                for (byte y=0;y<=1;y++){
                    System.out.println("Entre com a "+(y+1)+"ª nota:");
                    notas[i][y]=entrada.nextFloat();
                }//fim do for interno
                notas[i][2]=(notas[i][0]+notas[i][1])/2;
                if (notas[i][2]>=7) nomes[i][1]="Aprovado"; else nomes[i][1]="Repovado";
        }//for externo
        System.out.println("Relatório de Notas");
        System.out.println("\nNome \t\tNota 1 \t\tNota 2 \t\tMédia \t\tSituação");
        for (byte i=0; i<=(k-1);i++) System.out.println(nomes[i][0]+"\t\t"+notas[i][0]+"\t\t"+notas[i][1]+"\t\t"+notas[i][2]+"\t\t"+nomes[i][1]);

    }//fim do main
}//fim da classe
    
asked by anonymous 28.10.2014 / 07:51

4 answers

2

1st Mode:

nomes[i][0]=lerString();
for (int y=0;y<=1;y++){
     System.out.println("Entre com a "+(y+1)+"ª nota:");
     notas[i][y]=entrada.nextFloat();
}//fim do for interno

//[...]

public static String lerString(){
     return entrada.next()+entrada.nextLine();
}

Do not forget to declare the scanner entrada as static to be recognized in the function.

2nd Mode (recommended)

   nomes[i][0]=entrada.nextLine();
    for (int y=0;y<=1;y++){
         System.out.println("Entre com a "+(y+1)+"ª nota:");
         notas[i][y]=entrada.nextFloat();
    }//fim do for interno
    entrada.nextLine()//descarrega o buffer do teclado, antes de ler a próxima string

Whenever you read a string after reading a numeric value you need to unload the keyboard buffer before reading the string,

    
31.08.2015 / 08:29
0

The right thing would be for you to use a different Scanner for each primitive variable type. Or clear the contents inside your Scanner and use it again (I do not recommend)

    
13.11.2014 / 15:19
0

Here's a gambi to solve your problem.

Change this:

nomes[i][0]=entrada.nextLine();

So:

String lido = null;
do {
    lido = entrada.nextLine();
} while (lido == null || lido.trim().isEmpty());
nomes[i][0]=lido;
    
13.11.2014 / 15:30
-4

Put Scanner entrada=new Scanner(System.in); after the loop that works.

    
13.11.2014 / 15:02