Java:如何使用Scanner检查输入是否为整数且在指定范围内

Java: How to use a Scanner to check that input is an integer and is within a specified range

我的代码有问题。

它应该做什么:

问题:

下面是我的意思的截图:Screenshot of the problem

private static int inputGuess () {
    Scanner myScanner = new Scanner(System.in);
    int guess = 0;
    if (myScanner.hasNextInt()) {
        guess = myScanner.nextInt();
    }
    if (1 > guess || guess > 200) {
        while (!(myScanner.hasNextInt()) || !(1 <= guess && guess <= 200)) {
            while (!myScanner.hasNextInt()) {
                myScanner.nextLine();
            }
            guess = myScanner.nextInt();
            if (!(guess >= 1 && guess <= 200)) {
                myScanner.nextLine();
            }
        }
    }
    return guess;
}

我尝试将@Hulk 的(最佳答案)逻辑(至少我认为我做到了)应用到一个方法中(很遗憾,这是我的项目的一个要求)并得到了这个:

private static int inputGuess () {
    Scanner myScanner = new Scanner(System.in);
    int guess = 0;

    while (!myScanner.hasNextInt() || guess < 1 || guess > 200) {
        while (!myScanner.hasNextInt()) {
            myScanner.nextLine();
        }
        guess = myScanner.nextInt();
        if (guess >= 1 && guess <= 200) {
            break;
        }
    }
    return guess;
}

经过一番测试还是没有报错! 如果您仍然发现错误,请与我分享,我将很高兴!

如果您将问题分解成更小的部分,这会变得更简单。首先,解决“读取直到我们得到一个整数”部分并​​将其放入一个方法以便我们可以重用它:

private static int readNumber(Scanner sc) {
     while (!sc.hasNextInt()) { 
         sc.nextLine(); // if its not a number, consume the line and wait for new input
     }
     return sc.nextInt(); // always an integer
}

现在,我们只需要添加范围检查:

private static int inputGuess () {
    Scanner myScanner = new Scanner(System.in);             
    
    int n = 0;
    while (n < 1 || n > 200) { // range check, only in one place
        n = readNumber(myScanner); // always returns a number
    }
    return n;       
}

你基本上把事情复杂化了,以不同的方式在 3 个地方重复范围检查,很容易迷失所有这些否定。保持方法简单,一次只做一件事!


解决您更新后的问题:如果您绝对需要将这些内联到一个方法中,结果如下:

private static int inputGuess () {
    Scanner myScanner = new Scanner(System.in);
    
    int n = 0;
    while (n < 1 || n > 200) { // loop until in valid range
        while (!myScanner.hasNextInt()) { 
         myScanner.nextLine(); // if its not a number, consume the line and wait for new input
        }              
        n = myScanner.nextInt(); // always an integer
    }
    return n; // always in valid range
}

请注意,仍然只有一个地方检查数字输入,并且只有一个地方验证范围。在编程中,很少有理由将完全相同的东西写两次——不要重复自己! - 'principle'/指南有时缩写为 DRY。