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

时间:2016-09-17 23:57:43

标签: java exception input java.util.scanner nosuchelementexception

我已经实现了一个方法,要求用户输入一个值。如果所述值超出范围或者值不正确,则应显示错误消息然后再次询问。

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

让这个方法起作用是至关重要的,因为如上所示,我需要其他几次来自用户的输入,而不仅仅是从菜单中选择,还要获得尺寸等家具的规格。什么不是。

感谢所有帮助。提前谢谢。

2 个答案:

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

    }

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