Java 为什么赢了';扫描仪是否提示我输入?
我有这个方法:Java 为什么赢了';扫描仪是否提示我输入?,java,loops,console,java.util.scanner,Java,Loops,Console,Java.util.scanner,我有这个方法: public String scanInput() { String input = ""; Scanner skanner = new Scanner(System.in); while(skanner.hasNextLine()){ input = skanner.nextLine(); } skanner.close(); return input; } 第一次运行此方法时,程序停止,在继续之前,控制台会提示
public String scanInput()
{
String input = "";
Scanner skanner = new Scanner(System.in);
while(skanner.hasNextLine()){
input = skanner.nextLine();
}
skanner.close();
return input;
}
第一次运行此方法时,程序停止,在继续之前,控制台会提示我输入。然而,第二次运行该方法时,它会毫不停顿地闪过,而我的程序陷入了无休止的循环中
此方法中的哪一行使程序暂停,为什么它只在第一次暂停?
skanner.hasnetline()在本例中返回false,因为它不从文件/网站等读取。skanner.hasnetline()在本例中返回false,因为它不会从文件/网站等处读取数据。您正在接近方法结束时关闭扫描仪。这将关闭它正在处理的流-系统。在本例中为
。这意味着下次调用该方法时,流仍处于关闭状态,因此没有行
您应该设置一个扫描仪
,并将其传递到方法中(或将其作为类中的状态)。您将在方法末尾关闭扫描仪。这将关闭它正在处理的流-系统。在本例中为
。这意味着下次调用该方法时,流仍处于关闭状态,因此没有行
您应该设置一个扫描仪
,并将其传递到方法中(或将其作为类中的状态)。您的程序在第二次运行时闪烁而不暂停的原因是因为系统。在
关闭时-关闭扫描仪
对象将关闭底层流
正如Jon所提到的,扫描器应该在这个函数之外设置一次,然后传递到方法中
回答第二个问题-导致程序暂停的行是.nextLine()
调用nextLine()
是一种所谓的“阻塞函数”
现在,您的代码只工作一次,因为System.in
实际上是控制台。您不能在
中“打开”系统。关闭的流无法重新打开
是的,每次调用函数时,您都在创建一个新的扫描仪
,但是创建一个扫描仪
对象并不会生成一个新的流,扫描仪
对象只接受一个流作为参数 您的程序在第二次运行时闪烁而不暂停的原因是System.in
已关闭-关闭扫描仪
对象将关闭底层流
正如Jon所提到的,扫描器应该在这个函数之外设置一次,然后传递到方法中
回答第二个问题-导致程序暂停的行是.nextLine()
调用nextLine()
是一种所谓的“阻塞函数”
现在,您的代码只工作一次,因为System.in
实际上是控制台。您不能在
中“打开”系统。关闭的流无法重新打开
是的,每次调用函数时,您都在创建一个新的扫描仪
,但是创建一个扫描仪
对象并不会生成一个新的流,扫描仪
对象只接受一个流作为参数 你的解决方案奏效了,但我不明白为什么它一开始就不起作用。当我第二次调用这个方法时,当我创建一个新的扫描器时,我会创建一个新的流吗?我不明白第二次调用该方法时有什么不同。@Magnus:不,它不会在每次访问System.in
时创建新流。它是一个流——流程的标准输入流。如果你关上它,它就不见了。啊哈!现在我明白了。谢谢;)你的解决方案奏效了,但我不明白为什么它一开始就不起作用。当我第二次调用这个方法时,当我创建一个新的扫描器时,我会创建一个新的流吗?我不明白第二次调用该方法时有什么不同。@Magnus:不,它不会在每次访问System.in
时创建新流。它是一个流——流程的标准输入流。如果你关上它,它就不见了。啊哈!现在我明白了。谢谢;)