我想询问用户是否要创建名为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循环是无限的,我不知道为什么。
答案 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);
}
答案 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个选项:
因为sc.hasNext()
始终为真。您需要致电sc.nextLine
以使此扫描仪超越当前行
sc.hasNext()
正在阻止(如documents中所述)
如果您确定它是否真的是无限循环或阻塞调用 - 您将知道如何解决它(只需在循环开始时添加跟踪,运行程序,并检查输出控制台)< / 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();