web-dev-qa-db-ja.com

Java Stringスキャナー入力は情報を待たず、次のステートメントに直接移動します。情報を待つ方法は?

ユーザーに複数の生徒を入力するように求めるシンプルなプログラムを作成してから、各生徒の名前とスコアの入力を求めて、どの生徒が最高のスコアを持っているかを判断します。

プログラムコードを作成し、コンパイルします。最初の行は、多数の学生を要求し、入力を待ちます。 2行目は学生名を入力して入力を待機することになっているため、3行目はansを出力してその学生のスコアを要求し、入力を待機する必要がありますが、2行目が印刷された後、3行目がすぐに呼び出されます(2行目は入力を待たずに)3行目以降に要求された情報を入力しようとすると、ランタイムエラーが発生します。

2行目が印刷され、3行目を印刷する前に文字列が入力されるのを待つようにコードを調整するにはどうすればよいですか?

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

だから私は しないでください この振る舞いのため、Scannerの使用が好きではありませんでした。 (何が起こっているのかを理解し、それに満足していると、スキャナーが大好きです)。

何が起こっているのかは、nextLine()の呼び出しが、ユーザーが生徒数を入力する行を最初に終了することです。どうして? nextInt()は1つのintのみを読み取り、行を終了しないためです。

したがって、余分なreadLine()ステートメントを追加すると、この問題を解決できます。

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();

すでに述べたように、スキャナーの使用は好きではありませんでした。以前は、BufferedReaderを使用していました。それはより多くの作業ですが、実際に何が起こっているかが少し簡単です。アプリケーションは次のようになります。

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
    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

悪いデザインのように見えます-整数を要求し、nextInteger()を実行すると、スキャナーは整数を提供しますが、ユーザーはEnterを押して送信する必要があるため、バッファーに新しい行文字を保持しています整数であるため、後でユーザーに文字列の入力を求める場合、入力を待たずに改行文字を返すだけです。この種の問題を回避するためにスキャナーをクリアすることはできません...

私は何が欠けていますか?

アダム

3
AdamT