为什么java.util.scanner会为每个空间重复循环

时间:2019-01-01 02:15:42

标签: java java.util.scanner

我有一个简单的问题。我一直在探索Java中的基本输入验证(仅接受用户的整数或双精度等。)。下面的代码非常适合简单的应用程序,但是确实激发了我的好奇心。每当您输入一个字母,然后在其后跟一个空格,然后再输入另一个字母时,它将两次显示“请重试。仅输入数字”消息。

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("Input Number, BOi");
        //Basic input validation. Only Accepts Integers.
        while (!sc.hasNextInt()){
            sc.next();//This Clears the Scanner for next input
            System.out.println("Try again. Input numbers only.");
        }
        int userInput = sc.nextInt();

        System.out.println("CONGRATS! YOU'VE ENTERED THE NUMBER: " + 
userInput);
    }
}

如果我要输入         p p p 那么结果将是

Try again. Input numbers only.
Try again. Input numbers only.
Try again. Input numbers only.

我希望结果仅Try again. Input numbers only.显示一次。谁能解释为什么会这样?我听过“ regex”一词,但不知道它是否相关。谢谢!

2 个答案:

答案 0 :(得分:0)

您的问题仅仅是对Scanner的工作原理缺乏了解。

  

“扫描程​​序”使用分隔符模式将其输入分为令牌,默认情况下,该模式与空格匹配。

因此,当您输入p p p时,Scanner.nextInt()会将p p p分成p然后是p然后是p。这就是为什么您收到3则相同消息的原因。

使用nextLine()方法获取整行,而不是“跳过”任何空格。

答案 1 :(得分:0)

这是因为next()不会占用整行。它只会消耗第一个单词,直到空格,其余的单词都留下为止。

因此,当循环将重复您遇到的单词直到找到int为止。 例如,您在这里给P P P意味着3个单词,因此三次迭代

因此,您应该使用:

  • sc.nextLine(),如果您期望非整数并对其进行解析
  • sc.nextInt();并在有人输入其他任何内容时处理异常 比int