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
时创建新流。它是一个流——流程的标准输入流。如果你关上它,它就不见了。啊哈!现在我明白了。谢谢;)