繁体   English   中英

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

[英]Why does java.util.scanner repeat loop for every space

我有一个简单的问题。 我一直在探索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);
    }
}

如果我输入ppp ,结果将是

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

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

您的问题仅仅是缺乏对Scanner实际工作方式的了解。

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

因此,当您输入pppScanner.nextInt()会将ppp分为p p以及p 这就是为什么您收到3则相同消息的原因。

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

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

因此,当循环将重复您遇到的所有单词,直到找到一个int为止。 例如,在这里您给PPP表示3个单词,因此三次迭代

因此,您应该使用:

  • sc.nextLine()如果您期望非整数并对其进行解析)
  • sc.nextInt(); 如果有人输入了int以外的任何东西,则处理异常

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM