我想知道如何阻止扫描仪从用户那里读取额外的错误输入。
例如,我想将用户输入2 one
作为2
读入变量diam
,以下程序实现。
问题是,下一个循环会自动检测输入中的one
剩余,并相应地执行if
语句。
我能够通过创建两个扫描仪来解决这个问题,但不幸的是,这个特定的任务不允许这样做。此外,我们还需要在我们的计划中使用.hasNextInt()
。
如何防止这种"溢出"只使用一台扫描仪?我不得不假设这个问题已经提出过,但我没有太多运气找到答案。
Scanner scnr = new Scanner(System.in);
System.out.print("Enter the diameter of a "
+ "cylinder (in centimeters): ");
// BEGIN: diameter input verification loop
for (;;) {
if (!scnr.hasNextInt()) {
System.out.print("Please enter an integer value "
+ "(less than 2,147,483,648) as decimal digits: ");
scnr.nextLine();
continue;
}
diam = scnr.nextInt();
if (diam >= 0) {
//null statement
}
else {
System.out.print("Please enter a positive integer value: ");
continue;
}
break;
}
//END: diameter input verification loop
//prompts user for container height
System.out.print("Enter the height of a "
+ "cylinder (in centimeters): ");
// BEGIN: height input verification loop
for (;;) {
if (!scnr.hasNextInt()) {
System.out.print("Please enter an integer value "
+ "(less than 2,147,483,648) as decimal digits: ");
scnr.nextLine();
continue;
}
height = scnr.nextInt();
if (height >= 0) {
//null statement
}
else {
System.out.print("Please enter a positive integer value: ");
continue;
}
break;
}
//END: height input verification loop`
答案 0 :(得分:2)
一种选择是只读取Scanner
的整行输入,然后只保留第一个单词。例如,对于圆柱体的直径,您可以使用:
System.out.print("Enter the diameter of a cylinder (in centimeters): ");
String input = scnr.nextLine();
try {
int diam = Integer.parseInt(input.split(" ")[0]);
}
catch (NumberFormatException e) {
System.out.print("Please enter an integer value "
+ "(less than 2,147,483,648) as decimal digits: ");
}
答案 1 :(得分:1)
我可以想到几种方法:
Tim指出,您可以使用readLine()
从用户那里读取完整的一行,然后解析该行。您可以使用split
,或创建新的扫描程序来解析该行或其他各种方法。
您可以坚持使用一个Scanner
并调用nextLine()
来丢弃未使用的字符,直至并包括下一行结尾。显然,你需要在调用nextInt()
之后执行此操作。例如:
height = -1;
while (height < 0) {
if (!scnr.hasNextInt()) {
System.out.print("Please enter an integer value "
+ "(less than 2,147,483,648) as decimal digits: ");
} else {
height = scnr.nextInt();
if (height < 0) {
System.out.print("Please enter a positive integer value: ");
}
}
scanner.nextLine();
}
(上面的代码版本重组了一些内容,以摆脱break
和continue
。重组也允许我将readLine作为循环的无条件最后语句。我认为它使逻辑更容易理解......)
答案 2 :(得分:1)
// BEGIN: height input verification loop
for (;;) {
scnr.nextLine(); /* read fresh input, deleting the left over input */
if (!scnr.hasNextInt()) {
System.out.print("Please enter an integer value " + "(less than 2,147,483,648) as decimal digits: ");
scnr.nextLine();
continue;
}
height = scnr.nextInt();
if (height >= 0) {
// null statement
} else {
System.out.print("Please enter a positive integer value: ");
continue;
}
break;
}
您只需添加scnr.nextLine()
即可删除之前输入中剩余的“旧”scnr
。这解决了溢出问题。