web-dev-qa-db-fra.com

Java String Scanner input n'attend pas les informations, passe directement à la déclaration suivante. Comment attendre les informations?

J'écris un programme simple qui invite un utilisateur à entrer un certain nombre d'étudiants, puis lui demande d'entrer le nom et le score de chaque étudiant afin de déterminer quel étudiant a le score le plus élevé.

J'ai écrit le code du programme et il se compile. La première ligne demande un certain nombre d'élèves et attend la saisie. La deuxième ligne est censée demander un nom d'élève et attendre la saisie, puis une troisième ligne devrait imprimer et demander le score de cet élève, et attendre la saisie mais après l'impression de la deuxième ligne, la troisième ligne est immédiatement appelée (la deuxième ligne pas attendre la saisie), puis j'obtiens une erreur d'exécution lorsque j'essaie d'entrer les informations demandées après la troisième ligne.

Comment ajuster le code pour que la deuxième ligne s'imprime et attend la saisie d'une chaîne avant d'imprimer la troisième ligne?

import Java.util.Scanner;

public class HighestScore {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.print("Enter the number of students: ");
        int numOfStudents = input.nextInt();

        System.out.print("Enter a student's name: ");
        String student1 = input.nextLine();

        System.out.print("Enter that student's score: ");
        int score1 = input.nextInt();

        for (int i = 0; i <= numOfStudents - 1; i++) {

            System.out.println("Enter a student's name: ");
            String student = input.nextLine();

            System.out.println("Enter that student's score: ");
            int score = input.nextInt();

            if (score > score1) {
            student1 = student;
            score1 = score;
            }
        }
        System.out.println("Top student " +
        student1 + "'s score is " + score1);
    }
}
25
user1011064

C'est pourquoi je ne pas n'a pas aimé utiliser un Scanner, à cause de ce comportement. (Une fois que j'ai compris ce qui se passait et que je me suis senti à l'aise avec ça, j'aime beaucoup Scanner).

Ce qui se passe, c'est que l'appel à nextLine() termine d'abord la ligne où l'utilisateur entre le nombre d'élèves. Pourquoi? Parce que nextInt() ne lit qu'un seul entier et ne termine pas la ligne.

Ainsi, l'ajout d'une instruction readLine() supplémentaire résoudrait ce problème.

System.out.print("Enter the number of students: ");
int numOfStudents = input.nextInt();

// Skip the newline
input.nextLine();

System.out.print("Enter a student's name: ");
String student1 = input.nextLine();

Comme je l'ai déjà mentionné, je n'aimais pas utiliser Scanner. Ce que j'avais l'habitude de faire était d'utiliser un BufferedReader. C'est plus de travail, mais c'est un peu plus simple ce qui se passe réellement. Votre application ressemblerait à ceci:

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

System.out.println("Enter the number of students: ");
int numOfStudents = Integer.parseInt(input.readLine());

String topStudent = null;
int topScore = 0;
for (int i = 0; i < numOfStudents; ++i)
{
    System.out.print("Enter the name of student " + (i + 1) + ": ");
    String student = input.nextLine();

    // Check if this student did better than the previous top student
    if (score > topScore)
    {
         topScore = score;
         topStudent = student;
    }
}
45
Martijn Courteaux
    System.out.print("Enter the number of students: ");
    int numOfStudents = input.nextInt();
    // Eat the new line
    input.nextLine();
    System.out.print("Enter a student's name: ");
    String student1 = input.nextLine();
15
Prince John Wesley

Wow, cela ressemble à une mauvaise conception - si vous demandez un entier et faites un nextInteger (), le scanner vous donnera l'entier, mais il contient maintenant un nouveau caractère de ligne dans son tampon car l'utilisateur doit appuyer sur Entrée pour soumettre le entier, donc si vous souhaitez ultérieurement demander à l'utilisateur une chaîne, il n'attendra pas l'entrée et vous donnera simplement un nouveau caractère de ligne. Vous ne pouvez pas effacer le scanner pour éviter ce genre de problème ...

Qu'est-ce que je rate?

Adam

3
AdamT