while(scanner.hasNext())循环不工作两次? Java的

时间:2013-10-07 15:19:23

标签: java while-loop java.util.scanner

我做了一个像自动售货机的程序!

我的代码类似于:

public static void main (String [] args) {
    Scanner sc = new Scanner (System.in);
    while(sc.hasNext()) {
        String string = sc.next();

        sum = generateSum(sum)
        .....
    }
}

public static int generateSum(int sum) {
    Scanner sc = new Scanner (System.in);
    while (sc.hasNext()) {
        ....
    }

    return sum;
}

很抱歉简化我的代码,但正常的代码很长!但问题是我使用while (sc.hasNext())循环两次。基本上我想继续我的main方法,直到用户输入为TERMINATE,但我的程序在运行一次后终止。

我想如果我拿出我的generateSum方法,那么我的main方法中的循环工作正常,所以我想它必须与while (sc.hasNext())循环两次有关。

我有什么想法可以解决问题吗?

3 个答案:

答案 0 :(得分:1)

hasNext()方法将一直阻塞,直到你点击System.in上的文件结束标记,因为它不知道是否有更多输入,直到它读取完整的缓冲区值或命中文件末尾(您可以通过Windows上的Control-Z和unix上的Control-D发出信号)。此时System.in位于EOF标记处,无法从代码中重新打开它。

如果您需要处理来自System.in的多个数据流,您将不得不使用某种类型的标记值(例如单词END)来标记一个输入流的结尾和另一个输入流的开头

答案 1 :(得分:0)

我很确定如果您使用sc.next()消耗了正在扫描的输入,则状态会发生变化并且hasNext()会相应地返回。问题可能就在那里。

答案 2 :(得分:0)

可以根据需要调用hasNext()方法。但是如果在内部循环中调用next()方法,则可以使用外循环中的值。

所以内部循环最有可能在hasNext()为假之后中断,因此外部循环也会完成。