while循环之后的java代码永远不会执行
显然,我的真实代码更复杂,但下面是一个示例:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in).useDelimiter("\n");
String[] cmdSplit = null;
while (true) {
while (input.hasNext()) {
cmdSplit = input.next().split("\\s+");
System.out.println("stuff");
}
for (int i = 0; i < cmdSplit.length; i++) System.out.println(cmdSplit[i]);
}
}
}
在上面的示例中,代码从System.in
获取输入,将其拆分,并输出每个片段。但是,由于某种原因,内部while
循环之后的代码永远不会执行。如果我用if
替换while
,它会工作。如果您测试它,您可以看到它不会无限运行,因为它只打印“东西”一次,显示循环运行一次。while
循环有什么问题
# 1 楼答案
从
System.in
读取与从文件或其他固定大小的输入源读取不同。在您创建输入之前,输入不一定存在,因此在输入实际到达(即您键入输入)之前,尝试读取输入需要block。尝试键入另一行-您将再次看到stuff
消息;这将允许.hasNext()
返回,因为现在有输入要使
.hasNext()
返回false
,需要关闭输入源。对于命令行应用程序,您可以通过发送EOF signal(在Linux上为Ctrl+D)来实现这一点,它告诉进程stdin没有更多的输入。但是,这通常不是您希望程序工作的方式,因此,如果您的目的是只读取一行,然后继续,那么实际上您应该使用if
而不是您尝试使用的while
。稍后,如果您需要读取更多输入,您将再次调用.hasNext()
,您的程序将在那里阻塞,直到用户传递更多输入正如@user7提到的,您的外部
while (true)
与while(input.hasNext())
组合是多余的。如果您只想读取一次,请去掉while (true)
并使用if (input.hasNext())
。否则,如果您想永远阅读,只需将两个循环组合起来:# 2 楼答案
是的,您的代码不会进入
for
循环,因为Scanner.hasNext()
将始终侦听控制台的输入你必须打破循环,才能走出去进入for循环
# 3 楼答案
它只打印一次“stuff”的原因是hasNext()返回false
让我解释一下我所观察到的情况
为了不确定地打印“资料”,必须删除作业。这意味着一旦您分配了输入,扫描仪就不再有任何标记
这将无限期打印