Scanner.nextLine does not pick up information after Scanner.nextInt

Asked

Viewed 1,673 times

1

I’m having trouble with this code, I’m starting in programming, this is just an activity for practice. I do not understand why when executing the code the field 'Campus' does not allow the entry of information. It already goes to the field 'Registration'

Campus: Registration (Numbers only):

Remember, it’s just an initial practice of the programming discipline, nothing too far-fetched.

package classescanner;

import java.util.Scanner;
/**
 * @author magnolia
 */
public class ClasseScanner {

    public static void main(String[] args) {

        String nome, sexo, matricula;
        String campus;
        int ano;
        double nota1, nota2, media;


        Scanner entrada = new Scanner (System.in);
        String escola = "IFRN CAMPUS ";

        System.out.println("------------------------------");
        System.out.println("DIGITE AS INFORMAÇÕES DO ALUNO");
        System.out.println("------------------------------");

        System.out.print("Nome completo: ");
        nome = entrada.nextLine();

        System.out.print("Sexo: ");
        sexo = entrada.nextLine();

        System.out.print("Ano de nascimento (yyyy): ");
        ano = entrada.nextInt();

        System.out.print("Campus: ");
        campus = entrada.nextLine();

        System.out.print("Matrícula (Apenas números): ");
        matricula = entrada.nextLine();

        System.out.print("Nota 1: ");
        nota1 = entrada.nextDouble();

        System.out.print("Nota 2: ");
        nota2 = entrada.nextDouble();

        media = (nota1 + nota2) / 2;

        System.out.println("--------------");
        System.out.println("SITUAÇÃO FINAL");
        System.out.println("--------------");

        System.out.println(escola.concat(campus).toUpperCase());
        System.out.println("Matrícula nº: " + matricula);
        System.out.println("Aluno(a): " + nome.toUpperCase() + " - Sexo: " + sexo.substring(0,1).toUpperCase() + " - Nascido(a) em: " + ano);

        if (media >= 60){

            System.out.println("Status: APROVADO(A)");
        }
        else {
            System.out.println("Status: REPROVADO(A)");
        }        
    }    
}
  • Instead of nextLine() use only next()

  • Corrected code and explanation according to comments and other suggested topic.

1 answer

2

According to the scanner class documentation the method nextLine returns the remainder of the last line that was read, which in this case is only a enter, so the reading is ignored. Then following the orientation of this topic How to use the Java scanner I modified the code to use only nextLine and perform the conversion by checking the type.

import java.util.Scanner;

public class ClasseScanner {

  private static Scanner entrada;

  public static void main(String[] args) {
    String nome, sexo, matricula;
    String campus;
    int ano;
    double nota1, nota2, media;

    entrada = new Scanner(System.in);
    String escola = "IFRN CAMPUS ";

    try {
      System.out.println("------------------------------");
      System.out.println("DIGITE AS INFORMAÇÕES DO ALUNO");
      System.out.println("------------------------------");

      System.out.print("Nome completo: ");
      nome = entrada.nextLine();

      System.out.print("Sexo: ");
      sexo = entrada.nextLine();

      System.out.print("Ano de nascimento (yyyy): ");
      ano = lerInteiro();

      System.out.print("Campus: ");
      campus = entrada.nextLine();

      System.out.print("Matrícula (Apenas números): ");
      matricula = entrada.nextLine();

      System.out.print("Nota 1: ");
      nota1 = lerNumerico();

      System.out.print("Nota 2: ");
      nota2 = lerNumerico();

      media = (nota1 + nota2) / 2;

      System.out.println("--------------");
      System.out.println("SITUAÇÃO FINAL");
      System.out.println("--------------");

      System.out.println(escola.concat(campus).toUpperCase());
      System.out.println("Matrícula nº: " + matricula);
      System.out.println("Aluno(a): " + nome.toUpperCase() + " - Sexo: " + sexo.substring(0, 1).toUpperCase() + " - Nascido(a) em: " + ano);

      if (media >= 60) {

        System.out.println("Status: APROVADO(A)");
      } else {
        System.out.println("Status: REPROVADO(A)");
      }
    } catch (NumberFormatException ex) {
      System.out.println("O valor digitado não é um número válido!");
    }
  }

  private static int lerInteiro() {
    String digitado = "";

    digitado = entrada.nextLine();

    return Integer.parseInt(digitado);
  }

  private static double lerNumerico() {
    String digitado = "";

    digitado = entrada.nextLine();

    return Double.parseDouble(digitado);
  }
}

As a result:

run:
------------------------------
DIGITE AS INFORMAÇÕES DO ALUNO
------------------------------
Nome completo: Lucas S
Sexo: Masculino
Ano de nascimento (yyyy): 1988
Campus: Ponta Grossa
Matrícula (Apenas números): 84025350
Nota 1: 100
Nota 2: 80
--------------
SITUAÇÃO FINAL
--------------
IFRN CAMPUS PONTA GROSSA
Matrícula nº: 84025350
Aluno(a): LUCAS S - Sexo: M - Nascido(a) em: 1988
Status: APROVADO(A)
CONSTRUÍDO COM SUCESSO (tempo total: 19 segundos)
  • Right @Sorack, that way solves my problem... Thank you...

Browser other questions tagged

You are not signed in. Login or sign up in order to post.