使用扫描仪获取正确的输入值

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");
            }
        }

    }

试试这个。它可能有助于实现你想做的事情。