我已经实现了一个方法,要求用户输入一个值。如果所述值超出范围或者值不正确,则应显示错误消息然后再次询问。
public static Integer getValue (Integer minValue, Integer maxValue) {
Scanner input;
input = new Scanner (System.in);
Integer value;
value = null;
while (true) {
try {
value = input.nextInt();
input.nextLine();
if ((value >= minValue) && (value <= maxValue)) {
break;
} else {
// Shows message that says value is not in range.
continue;
}
} catch (InputMismatchException IME) {
// Shows message that says value is not an integer.
input.next();
continue;
}
}
input.close();
return(value);
}
代码可以在被赋予不需要的值时正确识别。当值实际上是正确的时,问题出现了,然后它就会挂起并将我带到调试器。
这是一个执行的例子:
Select the type of furniture:
1. - Dresser.
2. - Shelf.
3. - Rectangular table.
4. - Round table.
You chose: abc // Asks again because the value entered is not int.
a b c
adsf
5 // Asks again because the value entered is not in range.
1 // Here it is when the compiler takes me to the debugger.
如果我强行执行超过这一点,会发生什么?它向我显示下面的菜单然后在询问用户另一个值后它完全崩溃:
Select the type of wood.
1. - Mahogamy.
2. - Cherry-tree.
3. - Walnut.
4. - Pine tree.
5. - Oak tree.
You chose: Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
这是从main调用它的方式:
furnitureMenu();
indexTree = getValue(minIndexFurniture, maxIndexFurniture);
woodMenu();
indexWood = getValue(minIndexWood, maxIndexWood);
让这个方法起作用是至关重要的,因为如上所示,我需要其他几次来自用户的输入,而不仅仅是从菜单中选择,还要获得尺寸等家具的规格。什么不是。
感谢所有帮助。提前谢谢。
答案 0 :(得分:0)
在查看了本网站的其他相关问题之后,我已经完成了自己的结论。这是解决它的一个问题:java.util.NoSuchElementException - Scanner reading user input
当你在第一种方法中调用sc.close()时,它不仅会关闭你的 扫描程序,但也关闭您的System.in输入流。
正如我的问题所示,我的代码在我的方法中实例化了一个新的扫描程序,输入正确的值后,该方法关闭扫描程序,这会阻止在随后调用该方法后输入新的输入。
这是我做的修订:
public static Integer getValue (Scanner input, int minValue, int maxValue) {
int value;
value = 0;
while (true) {
try {
value = input.nextInt();
if((value < minValue) || (value > maxValue)) {
// ERROR message goes here
} else {
break; // Input successful, break loop.
}
} catch (InputMismatchException IME) {
// ERROR message goes here.
input.nextLine(); // Discards input so user can try again
}
}
return (value);
}
如本修订版所示,扫描程序先前已在main函数中实例化并作为参数传递,因此它可以在后续调用中检索方法内用户的输入。
我还改进了从Deitel的书 Java如何编程 第11章:异常处理中获取笔记的方式,并根据我的具体情况进行了调整。
答案 1 :(得分:0)
public static Integer getValue(Integer minValue, Integer maxValue) {
Scanner input;
input = new Scanner(System.in);
int value;
while (true) {
System.out.println("Please enter a value");
if(!input.hasNextInt()) {
System.out.println("That's not a number!");
input.next(); // this is important!
}
value = input.nextInt();
if ((value >= minValue) && (value <= maxValue)) {
return value;
} else {
System.out.println("Wrong value please provide a valid input");
}
}
}
试试这个。它可能有助于实现您想要做的事情。