使用Scanner时的无限循环 - java

时间:2014-09-24 10:15:01

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

我想询问用户是否要创建名为file.elt的文件。我尝试使用Scanner类的switch语句来执行此操作。

这是我的代码:

    System.out.println("Do you want to create the file.elt? (Y/N)");
            strOption=sc.nextLine();

        OUTER:
        while (sc.hasNext()) {
            switch (strOption) {
                case "Y":
                case "y":
                    elements.createElements(file);
                    break OUTER;
                case "N":
                case "n":
                    System.out.println("There will be no file.elt created! .");
                    break OUTER;
                default:
                    System.out.println("Please, type Y or N.");
                    strOption=sc.nextLine();
                    break;
            }                
        }
        sc.close();

sc对象在程序开头声明,我要求提供文件名。

sc声明是:

    String file;

    Scanner sc = new Scanner(System.in);

    System.out.println("Type the name of the file .dat .");

    file=sc.nextLine();

问题在于while循环是无限的,我不知道为什么。

4 个答案:

答案 0 :(得分:5)

您没有更新strOption。 您应该在strOption=sc.nextLine();循环中移动while 此外,正如TheLostMind指出的那样,将hasNext替换为hasNextLine


修改

您可以考虑切换到Console。此外,您可以创建confirm实用程序方法,因为它是相当常见的任务:

private Console console;

...
console = System.console();
...
if (confirm("Do you want to create the file.elt? (Y/N)")) {
    elements.createElements(file);
} else {
    System.out.println("There will be no file.elt created! .");
}
...

private boolean confirm(String message) {
    String answer = console.readLine(message);
    while (!answer.matches("[YyNn]")) {
        answer = console.readLine("Please, type Y or N.");
    }
    return "Y".equalsIgnoreCase(answer);
}

注意:此doesn't work in eclipse

答案 1 :(得分:1)

扫描仪是基于状态的,有点困难。我不会将它用于非令牌的东西。

//strOption=sc.nextLine();
OUTER:
while (sc.hasNextLine()) {
    strOption=sc.nextLine();
...
        default:
            System.out.println("Please, type Y or N.");
            //strOption=sc.nextLine();

答案 2 :(得分:1)

2个选项:

  1. 因为sc.hasNext()始终为真。您需要致电sc.nextLine以使此扫描仪超越当前行

  2. sc.hasNext()正在阻止(如documents中所述)

  3. 如果您确定它是否真的是无限循环或阻塞调用 - 您将知道如何解决它(只需在循环开始时添加跟踪,运行程序,并检查输出控制台)< / p>

答案 3 :(得分:1)

首先,除非您知道自己在做什么,否则请不要使用OUTER等标签。在这种情况下,不需要它。

sc.hasNext()返回true(否则你甚至不会进入循环)并且在循环中你不会做任何改变那种状态的事情(你不会&#39;消费输入流。

在你进入循环之前,你会读到第一行,之后显然有更多的输入被读取,但你从未读过那个输入,所以sc.hasNext()一直返回true而while循环永远不会完成。

你的break OUTER;打破了OUTER:中定义的循环,这意味着它打破了while循环,不是while循环的OUT。通常人们会使用这个结构来打破内循环到外循环,但正如我之前所说,你最好不要使用这个结构。

编辑:我把带有标记的断点弄糊涂了。基本上,这里的突破按预期工作,但标签是多余的(我仍然建议不要使用标签)。

问题在于,您阅读的第一行输入可能并不等于&#34; y&#34;,&#34; Y&#34;,&#34; n&#34;或&#34; N&#34;出于某种原因,由于您不使用输入,sc.hasNext()strOption仍然包含与您的任何case语句不相等的相同字符串,这意味着循环将继续无限。

使用普通break;修复你的循环,以便消耗输入。

例如:

System.out.println("Do you want to create the file.elt? (Y/N)");

while (sc.hasNext()) 
{
    String inputString = strOption=sc.nextLine();
    // handle inputString          
}
sc.close();