java - 使用 Scanner 时确保用户输入是单个整数

标签 java java.util.scanner

期望的结果:

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

我尝试通过执行以下操作来实现此目的:

  • 将用户输入存储在变量中
  • 计算变量中的标记数量
  • 如果没有一个 token ,则拒绝输入
  • 如果输入不是数据类型 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 个字符串)也是如此。

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

最佳答案

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

似乎对我有用:

    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);

Update: Alternate approach without using 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);

Update 2: Another approach using regular expressions to validate input before accepting it.

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);

希望这有帮助!

关于java - 使用 Scanner 时确保用户输入是单个整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42129169/

相关文章:

java - 纯线程安全的 Java 类

Java算术运算符,请解释输出

java - JRE 到期日

java - 扫描仪在输入文件的末尾处失败

java - 在Java中,如何确定输入值是否为整数,然后存储该值而不必再次询问?

java - 使用不同的 JPanel 替换 JPanel

java - Android - Http 获取请求

java.util.Dictionary 是抽象的;无法初始化

java - 如何解析格式类似于成绩簿的文本文件?

java - 使用 Java Scanner 顺序读取 stdin 时抛出异常