【问题标题】:Why won't the scanner prompt me for an input?为什么扫描仪不提示我输入?
【发布时间】:2015-03-09 19:09:48
【问题描述】:

我有这个方法:

public String scanInput()
{
    String input = "";
    Scanner skanner = new Scanner(System.in);
    while(skanner.hasNextLine()){
        input = skanner.nextLine();
    }
    skanner.close();
    return input;
}

第一次运行此方法时,程序会停止,并且会提示我在控制台中进行输入,然后才能继续。但是,第二次运行该方法时,它没有暂停就闪过,我的程序陷入了无限循环。

这个方法中哪一行让程序暂停,为什么只在第一次暂停?

【问题讨论】:

    标签: java loops console java.util.scanner


    【解决方案1】:

    您正在接近方法结束时关闭扫描仪。这将关闭它正在处理的流 - 在这种情况下为System.in。这意味着下次调用该方法时,流仍处于关闭状态,因此没有行。

    您应该设置 一个 Scanner,并将其传递给方法(或将其作为您的类中的状态)。

    【讨论】:

    • 您的解决方案有效,但我不明白为什么它一开始就无效。当我创建一个新的 Scanner 时,我不会在第二次调用该方法时创建一个新流吗?我不明白第二次调用该方法有什么不同。
    • @Magnus:不,它不会在您每次访问 System.in 时创建一个新流。它是 one 流 - 进程的标准输入流。如果你关闭它,它就消失了。
    • 啊哈!现在我懂了。谢谢;)
    【解决方案2】:

    您的程序在第二次运行时没有暂停就闪过的原因是因为System.in 已关闭——关闭Scanner 对象将关闭底层流。

    正如 Jon 所提到的,扫描仪真的应该在这个函数之外设置一次,然后传递给方法。

    回答您的第二个问题 - 导致程序暂停的行是 .nextLine() 调用。 nextLine() 就是所谓的“阻塞函数”。

    现在,您的代码只能运行一次,因为System.in 本质上是控制台。你不能“打开”System.in。已关闭的流无法重新打开。

    是的,您每次调用函数时都会创建一个新的 Scanner - 但是创建一个 Scanner 对象不会创建一个新流 - Scanner 对象只接受一个流作为参数。

    【讨论】:

      【解决方案3】:

      skanner.hasNextLine() 在这种情况下返回 false,因为它不从文件/网站等读取。

      【讨论】:

        猜你喜欢
        • 2017-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-04
        相关资源
        最近更新 更多