【问题标题】:Using Scanner to validate user input使用 Scanner 验证用户输入
【发布时间】:2014-05-26 02:42:51
【问题描述】:

我很难弄清楚如何正确使用扫描仪来验证用户输入。例如,程序需要用户输入int,用户只能输入正数,如果用户输入“apple”,“delicious apple”,或负数,问题会显示错误信息。我试过下面的代码,然后我发现了一个令人不安的问题,“那不是数字!”打印了两次,我不知道是什么导致了这个问题....

import java.util.*;
public class input {
    public static void main(String[] args){

        Scanner sc = new Scanner(System.in);
        int number;

        do {
            System.out.println("Please enter a positive number!");
            while (!sc.hasNextInt()) //scan
            {
                System.out.println("That's not a number!");
                sc.nextLine();  //scan
            }
            number = sc.nextInt();

        }
        while (number <= 0);

        System.out.println("Thank you! The positive number is " + number);
    }
}

Here is the result:
Please enter a positive number!
dfd
That's not a number!
-2232
Please enter a positive number!
dfd dfd
That's not a number!
That's not a number!

我意外地通过在“number = sc.nextInt()”下面添加了额外的代码行来解决这个问题,现在我的代码变成了:

import java.util.*;

public class input {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int number;

        do {
            System.out.println("Please enter a positive number!");
            while (!sc.hasNextInt()) //scan
            {
                System.out.println("That's not a number!");
                sc.nextLine();  //scan
            }
            number = sc.nextInt();
            sc.nextLine();  //scan

        }
        while (number <= 0);

        System.out.println("Thank you! The positive number is " + number);
    }
}

Here is the result:
Please enter a positive number!
dfd
That's not a number!
-2323
Please enter a positive number!
dfd dfd
That's not a number!
fdfd 322
That's not a number!
23 sdfd
Thank you! The positive number is 23

这次“那不是数字”只打印了一次,但我真的不明白为什么通过放置“sc.nextLine()”有助于解决问题.....

还有一个问题,如果我还想在用户输入“23 sdfd”、“23 2323”之类的内容时验证用户输入,并且问题仍然提供提示用户重试的信息,该怎么办?直到他们输入正确的int?

【问题讨论】:

  • 是一个“正数”只是一个正整数吗?例如,你不考虑双打吗?
  • +1 @Adeeb 也一样,如果号码是long 而不是int,它将不起作用
  • 您似乎对自己是在编写代码还是代码自己编写感到困惑。您应该控制代码的行为方式(在任何情况下)。
  • 对于第一个代码,当您输入 -2232 时,流程将移出 while 循环。之后,您使用nextline() 输入另一个值。在您的输入中,您输入了一个字符串。之后,当重新迭代 do 时,您再次输入另一个值。所以Scanner 持有两个值。因此,输出被打印两次

标签: java validation input java.util.scanner user-input


【解决方案1】:

这是因为number = sc.nextInt(); 在您输入-2232 后没有使用换行符。所以它评估了那个换行符,确定它不是一个 int,并提示“这不是一个数字!”。然后你输入dfd dfd,判断不是int,提示“这不是数字!”再次。

您的编辑通过在读取 int 后使用换行符解决了问题。

Scanner is skipping nextLine() after using next(), nextInt() or other nextFoo() methods

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-19
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    相关资源
    最近更新 更多