0

我正在尝试编写一种方法来处理控制台应用程序中用户的所有输入。我一共调用了这个方法5次。第一次,条件是

a) 数字必须是正数和实数(double)

接下来的4次条件是

b) 数字必须大于 1

这是我的方法:

private static double numChk(int errNum) {

    final String[] ERROR_MESSAGE = {
            "\nPlease enter only positive, real-valued numbers",
            "\nPlease enter only positive numbers greater than 1" };
    Scanner in = new Scanner(System.in);
    double tempData;

    while (!in.hasNextDouble()) {
        System.out.println(ERROR_MESSAGE[errNum]);
        System.out.print("  Please try again: ");
        in.next();
    }
    tempData = in.nextDouble();

    // in.close();
    return tempData;
}

这是对此方法的示例调用:

 do {
        System.out
                .println("Please enter only positive, real-valued numbers");
        System.out.print("  Enter a constant: ");
        mu = numChk(0);
    } while (mu <= 0);

注意“// in.close();” 在我写的方法中。在不关闭扫描仪的情况下,此方法可以正常工作。但是,我的任务要求我确保关闭所有打开的输入流。如果我关闭方法中的输入流并重新打开它,我会得到 NoSuchElementException。我知道我可以将所有这些放入我的主要方法并在其末尾关闭输入但是,我想知道是否有办法做到这一点(输入验证,多次)并能够关闭输入流。

4

3 回答 3

3

当您调用 in.close() 时,您也在关闭 System.in。下次您尝试使用新的 Scanner 时,它将尝试使用已关闭的 System.in,这就是为什么当您尝试从中读取时会出现异常

请参阅: 使用 Scanner.next() 获取文本输入

于 2012-09-13T16:12:09.007 回答
1

如果在方法中调用 in.close(),则需要某种方法来确定它是否是最后一个输入。

我建议将扫描仪放在您的主要方法中,将扫描仪传递给该方法,然后在您完成所有输入后关闭它。

我怀疑正在发生的事情是您正在像从文件中一样通过管道发送输入。第一个扫描仪缓冲所有输入,当您关闭并重新打开它时,您最终会丢失缓冲到第一个扫描仪的数据。我不能保证,但这就是它的样子。

于 2012-09-13T15:53:13.010 回答
0

在 while 循环它尝试调用之后,通过这一行可能没有任何输入。

 tempData = in.nextDouble();
于 2012-09-13T15:52:25.520 回答