Подтвердить что ты не робот

Ввод Java String Scanner не дожидается информации, перемещается непосредственно в следующий оператор. Как дождаться информации?

Я пишу простую программу, которая побуждает пользователя вводить несколько учеников, а затем просит пользователя ввести имя и оценку каждого ученика, чтобы определить, какой студент имеет самый высокий балл.

Я написал код программы и компилируется. В первой строке запрашивается несколько учеников и ждет ввода. Вторая строка должна запросить имя ученика и ждать ввода, затем третья строка должна напечатать запрос на получение этого студенческого счета и дождаться ввода, но после того, как вторая строка будет напечатана, третья строка будет немедленно вызвана (вторая строка делает не ждите ввода), а затем я получаю ошибку времени выполнения при попытке ввести запрошенную информацию после третьей строки.

Как настроить код так, чтобы вторая строка печатала и ждет ввода строки перед печатью третьей строки?

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 name: ");
        String student1 = input.nextLine();

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

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

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

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

            if (score > score1) {
            student1 = student;
            score1 = score;
            }
        }
        System.out.println("Top student " +
        student1 + " score is " + score1);
    }
}
4b9b3361

Ответ 1

Вот почему я не не любил использовать Scanner из-за этого поведения. (Как только я понял, что происходит, и мне было удобно, мне очень нравится Scanner).

Что происходит, так это то, что вызов nextLine() сначала заканчивает линию, в которой пользователь вводит число студентов. Зачем? Поскольку nextInt() читает только один 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 name: ");
String student1 = input.nextLine();

Как я уже упоминал, мне не понравилось использование Scanner. То, что я использовал, это использовать 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;
    }
}

Ответ 2

    System.out.print("Enter the number of students: ");
    int numOfStudents = input.nextInt();
    // Eat the new line
    input.nextLine();
    System.out.print("Enter a student name: ");
    String student1 = input.nextLine();

Ответ 3

Ничего себе, это выглядит плохой дизайн - если вы попросите целое число и выполните следующий шаг, то сканер даст вам целое число, но теперь он содержит новый символ строки в своем буфере, поскольку пользователь должен нажать Enter чтобы отправить целое число, поэтому, если позже вы захотите запросить у пользователя строку, она не будет ждать ввода и просто вернет вам новый символ строки. Вы не можете очистить сканер, чтобы избежать этой проблемы...

Что мне не хватает?

Адам