Java:如何使用Scanner检查输入是否为整数且在指定范围内
Java: How to use a Scanner to check that input is an integer and is within a specified range
我的代码有问题。
它应该做什么:
- 检查扫描仪“myScanner”是否为整数
- 如果是整数,如果在1到200之间(都包含)
问题:
- 在第一次猜测不正确后,我需要输入两次具有正确值的整数。
下面是我的意思的截图: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。
我的代码有问题。
它应该做什么:
- 检查扫描仪“myScanner”是否为整数
- 如果是整数,如果在1到200之间(都包含)
问题:
- 在第一次猜测不正确后,我需要输入两次具有正确值的整数。
下面是我的意思的截图: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。