按Enter键时hasNextInt()一直等待输入

时间:2017-03-16 20:16:10

标签: java

这里的第一篇文章/问题和java的新内容。试图制作一个基于小文本的电影数据库应用程序。其中一部分是添加评论。问题是,当我在评论中询问分数[0-10]时,我只是按[enter],提示只是向下一步并继续等待输入。我希望将此字段留空是不可能的。以下是我到目前为止的情况:

int score;
do {
  while (!sc.hasNextInt()) {
    sc.next();
    System.out.print("\nInvalid input! ");
    System.out.print("Please enter a number from 0-10: ");
  }
  score = sc.nextInt();

  if (!(score >= 0 && score <= 10)) {
    System.out.print("\nInvalid input! ");
    System.out.print("Please enter a number from 0-10: ");
  }
} while (!(score >= 0 && score <= 10 ));

1 个答案:

答案 0 :(得分:2)

Scanner正在阅读令牌,即以空格分隔的文字。这意味着,只要你按Enter键,下一个令牌就还没有开始。

Scanner的一个谬误是它易于使用,但更容易被滥用,例如错误处理用户输入。

示例:如果使用进入123 abc<enter>会发生什么?您的代码将读取123并继续,将abc留在缓冲区中以进行下一个提示,这可能需要文本,因此将abc作为该文本读取。糟糕!!

大多数情况下,为了处理错误的用户输入,您绝不应使用hasNextXxx()以外的nextXxx()nextLine()方法。这是确保您为一个提示获得一个答案(输入)的唯一方法。

所以,你应该这样做:

int score;
for (;;) {
    System.out.print("Please enter a number from 0-10: ");
    String line = sc.nextLine();
    try {
        score = Integer.parseInt(line.trim());
    } catch (NumberFormatException e) {
        System.out.println("Invalid input! Not a number.");
        continue;
    }
    if (score < 0 || score > 10) {
        System.out.println("Invalid input! Out of range.");
        continue;
    }
    break;
}