L'entrée de Scanner de chaîne de Java n'attend pas l'information, se déplace directement à la déclaration suivante. Comment attendre pour info? [dupliquer]

Cette question a déjà une réponse ici:

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

j'ai écrit le code du programme et qu'il compile. La première ligne demande un certain nombre d'élèves et attend les commentaires. La deuxième ligne est censé demander un nom de l'étudiant et d'attente pour l'entrée, puis une troisième ligne d'impression sna demander de l'étudiant score, et attendre pour l'entrée, mais après la seconde ligne affiche, la troisième ligne est immédiatement appelé (2e ligne n'attend pas d'entrée), puis-je obtenir une erreur d'exécution lorsque vous essayez d'entrer les informations demandées après la troisième ligne.

comment ajuster le code pour que la deuxième ligne imprime et attende qu'une chaîne soit entrée 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);
    }
}
19
demandé sur Prince John Wesley 2011-10-24 18:51:40

3 réponses

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

Ce qui se passe est que l'appel à nextLine() d'abord les finitions de la ligne où l'utilisateur entre le nombre d'étudiants. Pourquoi? Parce que nextInt() lit seulement un int et ne termine pas la ligne.

donc ajouter un extra readLine() l'énoncé résoudrait ce problème 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'ai pas aimé utiliser le Scanner. Ce que je faisais était d'utiliser un lecteur tampon. C'est plus de travail, mais c'est un peu plus simple ce qui se passe réellement. Votre application devrait ressembler à 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;
    }
}
40
répondu Martijn Courteaux 2016-01-07 15:07:20
    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();
14
répondu Prince John Wesley 2011-10-24 14:56:08

Wow qui ressemble à une mauvaise conception - si vous demandez un entier et faites un nextInteger () le scanner vous donnera l'entier, mais il a maintenant un nouveau caractère de ligne dans son tampon que l'utilisateur doit presser enter pour soumettre l'entier, donc si vous voulez plus tard demander à l'utilisateur pour une chaîne de caractères, il n'attendra pas pour l'entrée et vous donnera juste en arrière un nouveau caractère de ligne. Vous ne pouvez pas effacer le scanner pour éviter ce genre de problème...

Ce qui me manque?

Adam

3
répondu AdamT 2013-08-01 08:07:07