【问题标题】:Ensuring user input is a single integer while using Scanner [duplicate]使用 Scanner 时确保用户输入是单个整数 [重复]
【发布时间】:2017-02-09 05:48:53
【问题描述】:

期望的结果:

  • 接受用户输入
  • 确保用户一次只输入 1 个整数值
  • 将该整数存储在变量中

我尝试通过执行以下操作来实现这一点:

  • 将用户输入存储在变量中
  • 计算变量中的标记数
  • 如果没有一个令牌,则拒绝输入
  • 如果输入的数据类型不是int,则拒绝输入

代码:

    Scanner scan = new Scanner(System.in);

    System.out.println("Enter an integer:");
    String myString = scan.nextLine();
    int tokens = new StringTokenizer(myString, " ").countTokens();

    while (tokens != 1 && !scan.hasNextInt()) {
        System.out.println("Enter a single integer");
        myString = scanner.nextLine();
        tokens = new StringTokenizer(myString, " ").countTokens();
    }

    int number = scanner.nextInt();
    System.out.println(number);

这段代码漏洞百出。输出不一致且不受欢迎。它通常以抛出java.util.InputMismatchException 错误结束,表明它试图存储的值不是int。我在一个循环之后和多个循环之后都遇到过这个错误,即使输入的类型和数量相同(例如 2 个字符串)。

我应该继续使用这段代码,还是应该尝试从不同的角度解决这个问题?

【问题讨论】:

  • 哎呀,感谢您指出这一点,这是我的帖子中的错字,但我的代码中没有,所以这不会导致任何问题。
  • 您不想在whileloop 条件中使用||(逻辑或)而不是&&(逻辑与)吗?
  • “我收到一堆错误”到底是什么错误?
  • @DavidChoweller 我的理解是&&会导致代码循环,直到正好有1个token并且它是一个整数,然后它将继续将整数值存储在变量@ 987654329@。除非输入既有一个标记又是一个整数,否则我希望用户必须提供新的输入。
  • @Code-Apprentice 我将在我的帖子中澄清这一点——除了java.util.InputMismatchException 之外,代码实际上并没有经常抛出错误。我没有看到任何模式。有时它会在几个循环中运行良好,使用相同的输入,有时它会在第一个循环时崩溃。我观察到很多不一致和错误,我会尝试在我的 OP 中添加一些。

标签: java java.util.scanner


【解决方案1】:

我稍微修改了你的程序。我的方法是接受单行输入。如果输入包含多个标记,请要求用户重新输入输入。如果只有一个输入,则检查输入是否为整数,如果不是,则作为用户再次提供输入。

似乎对我有用:

    Scanner scanner = new Scanner(System.in);

    String myString;
    int tokens;
    int number;

    do {
        System.out.println("Enter a single integer");
        myString = scanner.nextLine();
        tokens = new StringTokenizer(myString, " ").countTokens();
        try {
            number = Integer.parseInt(myString);
        } catch(NumberFormatException e) {
            tokens = 0;
            number = -1;
        }
    }while (tokens != 1);
    scanner.close();

    System.out.println(number);

更新:不使用StringTokenizer的替代方法

    Scanner scanner = new Scanner(System.in);

    String myString;
    boolean validInput;
    int number;

    do {
        System.out.println("Enter a single integer");
        myString = scanner.nextLine();
        try {
            number = Integer.parseInt(myString);
            validInput = true;
        } catch(NumberFormatException e) {
            validInput = false;
            number = -1;
        }
    }while (validInput == false);
    scanner.close();

    System.out.println(number);

更新 2:另一种使用正则表达式在接受输入之前对其进行验证的方法。

Scanner 允许我们使用正则表达式来匹配输入。如果输入与模式匹配,您可以使用它来接受输入。否则,丢弃它并要求用户再次提供输入。

代码如下:

    Scanner scanner = new Scanner(System.in);
    System.out.println("Enter a single integer");

    String integerPattern = "[+-]?\\d+$"; // positive or negative and digits only

    while(scanner.hasNext(integerPattern) == false) {
        String x = scanner.nextLine();// capture and discard input.
        System.out.println("Enter a single integer. '" + x + "' is an invalid input.");
    }
    int number = scanner.nextInt(); // capture input only if it matches pattern.
    scanner.close();
    System.out.println("number: " + number);

希望这会有所帮助!

【讨论】:

  • Th OP 没有提到输入应该在 0 到 10 之间。我认为他正在寻找一个整数作为输入。还是我误会了什么?
  • 不,看起来我做到了,但我不明白是否需要分词器,
  • 到目前为止,这似乎工作得很好,非常感谢!它对我来说也有很​​多新东西;我很感激这次学习机会!
  • 我认为不需要分词器,因为Integer.parseInt 会在输入中存在除整数以外的任何内容时返回错误,例如,两个整数之间有空格。跨度>
  • 这是一个正则表达式。它表示使用各种符号的字符串模式,是验证输入的一种非常标准的方法。它不仅限于 Java。大多数编程和脚本语言都支持 Regukar 表达式。在我的回答中,表达式首先检查可选的 + 或 - 符号,后跟一个或多个数字,并且不能包含其他任何内容。如果用户在输入中输入任何其他字符,则验证失败并提示重新输入输入。在 Google 上查找“正则表达式”,您将获得大量入门资源。学习愉快!!!
猜你喜欢
  • 1970-01-01
  • 2022-10-22
  • 2018-06-08
  • 2020-07-09
  • 2018-11-26
  • 2014-06-20
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多