扫描仪不会等待循环读取nextInt()

时间:2016-05-18 14:44:25

标签: java java.util.scanner

我需要读取一个整数然后显示一条消息,如果它不是一个整数,我需要循环直到只输入一个int。我对下面代码的问题是当它循环时它不会等待读取nextInt,它将继续循环 - 打印出try again消息。

    do {
        if (reader.hasNextInt()) {
            userX = reader.nextInt();
            isANumberFlag = true;
        } else {
            System.out.println("Please enter numbers only, try again: ");
        }
    } while (isANumberFlag == false);

3 个答案:

答案 0 :(得分:2)

由于阅读器的索引位于同一点,因此您陷入了while循环中。
因此,如果您输入"some non numeric gibberish",则指针将停留在该位置,程序将继续要求您输入数字。您可以通过在else子句中移动索引来解决此问题:

 Scanner reader = new Scanner(System.in);
    boolean isANumberFlag = false;
    int userX = 0;
    do {
      System.out.println("please enter a number: ");

      if (reader.hasNextInt()) {
        userX = reader.nextInt();
        isANumberFlag = true;
      }
      else {
        System.out.println("Please enter numbers only, try again: ");
        reader.next(); //move your index in the else clause
      }
    }
    while (isANumberFlag == false);
    System.out.println(userX);
  }

请注意,如果您输入的是部分数字的单词,例如"notValid5000",则此解决方案将要求您再次输入某些内容。

但是,如果您键入部分数字句子,例如:"notValid 5000",它将说出"Please enter numbers only, try again: "并直接接受数字5000部分作为整数。

另一种解决方案是将一行读取为String并通过使用正则表达式验证特定行是否为int

Scanner reader = new Scanner(System.in);
    boolean isANumberFlag = false;
    String input;
    int userX = 0;
    do {
      System.out.println("please enter a number: ");
      input = reader.nextLine();

      if (input.matches("\\d+")) {
        userX = Integer.parseInt(input);
        isANumberFlag = true;
      }
      else {
        System.out.printf("you typed %s, which is not allowed \n", input);
        System.out.println("Please enter numbers only, try again: ");
      }
    }
    while (isANumberFlag == false);
    System.out.println(userX);

如果整行都是数字,则此解决方案仅接受您的输入。

有关使用扫描仪进行int验证的更多信息,请访问this topic

答案 1 :(得分:0)

我会做类似下面的事情。您需要创建2个Scanner对象,第一个用于获取用户输入,第二个用于验证并获取int。

    Scanner sc = new Scanner(System.in);
    boolean isANumberFlag = false;
    int userX = 0;
    do {
        Scanner input = new Scanner(sc.nextLine());
        if (input.hasNextInt()) {
            userX = input.nextInt();
            isANumberFlag = true;
        } else {
            System.out.println("Please enter numbers only, try again: ");
        }
    } while (!isANumberFlag);
}

答案 2 :(得分:-1)

如果你的循环条件是!(reader.hasNextInt())那么为什么if (reader.hasNextInt())会运行?这些陈述相互矛盾。有人说它没有价值,有人说它有价值。尝试将if语句的条件更改为!(reader.hasNextInt())或使用布尔变量来控制循环。