Java String Scanner输入不等待信息,直接移动到下一个语句。如何等待信息?

时间:2011-10-24 14:51:41

标签: java string java.util.scanner

我正在编写一个简单的程序,提示用户输入一些学生,然后要求用户输入每个学生的姓名和分数,以确定哪个学生得分最高。

我编写了程序代码并编译。第一行要求一些学生并等待输入。第二行应该是要求学生姓名并等待输入,然后第三行应该打印ans询问该学生的分数,并等待输入但是在第二行打印后,立即调用第三行(第二行是不等待输入)然后在尝试在第三行之后输入所请求的信息时出现运行时错误。

如何调整代码以便在打印第三行之前打印第二行并等待输入字符串?

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

3 个答案:

答案 0 :(得分:45)

这就是为什么我不喜欢使用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's 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;
    }
}

答案 1 :(得分:15)

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

答案 2 :(得分:3)

哇看起来很糟糕的设计 - 如果你要求一个整数并且d执行nextInteger(),扫描器会给你一个整数,但它现在在其缓冲区中持有一个新的行字符,因为用户必须按Enter键提交整数,所以如果你以后想要提示用户输入一个字符串,它将不会等待输入,只是给你一个换行符。 您无法清除扫描仪以避免此类问题......

我错过了什么?

亚当