我需要读取一个整数然后显示一条消息,如果它不是一个整数,我需要循环直到只输入一个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);
答案 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())
或使用布尔变量来控制循环。