使用扫描仪获取正确的输入值
Getting a correct input value using scanner
我实现了一种要求用户输入值的方法。如果所述值超出范围或值类型不正确,它应该显示一条错误消息,然后再次询问。
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);
让这个方法起作用是至关重要的,因为如上所示,我还需要其他几次用户的输入,而不仅仅是从菜单 select,而且还需要获取规格家具尺寸之类的。
感谢所有帮助。提前致谢。
在本网站上详尽地查找其他相关问题后,我自己已经得出结论。这是解决它的一个问题:java.util.NoSuchElementException - Scanner reading user input
When you call, sc.close() in first method, it not only closes your
scanner but closes your System.in input stream as well.
如我的问题所示,我的代码在我的方法中实例化了一个新的扫描器,在输入正确的值后,该方法关闭了扫描器,这会阻止在随后调用该方法后输入新的输入。
这是我做的修改:
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);
}
如本次修订所示,扫描器先前已在主函数中实例化并作为参数传递,因此它可以在后续调用中检索方法内部用户的输入。
我还根据 Deitel 的书 Java 如何编程 第 11 章:异常处理[=26] 改进了它接收输入的方式=],我根据我的具体情况对其进行了调整。
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");
}
}
}
试试这个。它可能有助于实现你想做的事情。
我实现了一种要求用户输入值的方法。如果所述值超出范围或值类型不正确,它应该显示一条错误消息,然后再次询问。
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);
让这个方法起作用是至关重要的,因为如上所示,我还需要其他几次用户的输入,而不仅仅是从菜单 select,而且还需要获取规格家具尺寸之类的。
感谢所有帮助。提前致谢。
在本网站上详尽地查找其他相关问题后,我自己已经得出结论。这是解决它的一个问题:java.util.NoSuchElementException - Scanner reading user input
When you call, sc.close() in first method, it not only closes your scanner but closes your System.in input stream as well.
如我的问题所示,我的代码在我的方法中实例化了一个新的扫描器,在输入正确的值后,该方法关闭了扫描器,这会阻止在随后调用该方法后输入新的输入。
这是我做的修改:
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);
}
如本次修订所示,扫描器先前已在主函数中实例化并作为参数传递,因此它可以在后续调用中检索方法内部用户的输入。
我还根据 Deitel 的书 Java 如何编程 第 11 章:异常处理[=26] 改进了它接收输入的方式=],我根据我的具体情况对其进行了调整。
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");
}
}
}
试试这个。它可能有助于实现你想做的事情。