从命令行读取输入时出现NoSuchElementException

时间:2015-06-18 15:55:44

标签: java nosuchelementexception

我正在尝试从命令行读取输入并将其放在ArrayList中。我在程序中多次执行,但有一次抛出NoSuchElementException。我做错了什么?

public static ArrayList<Double> getInfoTwo ()
{
    ArrayList<Double> infoListTwo = new ArrayList<Double>();
    Scanner in = new Scanner(System.in);
    System.out.println("Please enter your total hours: ");
    infoListTwo.add(in.nextDouble());
    in.close();
    return infoListTwo;
}

2 个答案:

答案 0 :(得分:0)

看起来你的in.NextDouble()正在抛出这个。 根据Javadoc(http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#nextDouble()

这是因为没有数据供扫描仪阅读。尝试使用in.hasNextDouble()

围绕该调用

&#13;
&#13;
public static ArrayList<Double> getInfoTwo ()
{
    ArrayList<Double> infoListTwo = new ArrayList<Double>();
    Scanner in = new Scanner(System.in);
    System.out.println("Please enter your total hours: ");
    if (in.hasNextDouble()) {
       infoListTwo.add(in.nextDouble());
 
    }
    in.close();
    return infoListTwo;
}
&#13;
&#13;
&#13;

答案 1 :(得分:0)

问题在于:

当您在运行整个程序时只运行一次getInfoTwo()方法时,没有问题。但是当您多次调用此方法时,例如在循环中,会发生异常。

这可能是因为关闭了扫描仪输入流。第二次程序到达infoListTwo.add(in.nextDouble());时,inputStream将关闭。请注意,in.close();将关闭下面的inputStream,并且您传递给Scanner的inputStream是System.in。 System.in是一个静态变量。因此,当您在程序的一个运行会话中关闭它时,下次它已经关闭时。

顺便说一句,重要的是要解决这个问题。如果您需要从控制台读取多个输入并将其存储在List中,最好的解决方案是将read n输入的业务从控制台移动到getInfoTwo()方法,如下所示:

public static ArrayList<Double> getInfoTwo(int n) {
    ArrayList<Double> infoListTwo = new ArrayList<Double>();
    Scanner in = new Scanner(System.in);
    for (int i = 0; i < n; i++) {
        System.out.println("Please enter your total hours: ");
        infoListTwo.add(in.nextDouble());
    }
    in.close();
    return infoListTwo;
}

希望这会有所帮助,

祝你好运。