hasNext() - 什么时候阻止,为什么?

时间:2013-06-01 13:15:38

标签: java java.util.scanner

我正在尝试通过Scanner对象读取命令。为了检查输入语法,我使用sc.hasNext()(对于缺少命令的情况)。它在很多情况下都可以正常工作,但现在我将JavaAPI中描述为“可以阻塞并等待输入”的情况。

hasNext()方法何时阻止,我该如何控制它?有趣的事情是它在块之前的3个案例中完美地工作。此外,JavaAPI将hasNext()描述为检查是否存在另一个输入的正确方法,以便方法next()不会产生Exception

这是我到目前为止所做的代码:

if (sc.hasNext() && sc.next().equals("create")) {
    if (sc.hasNextInt()) {
        width = sc.nextInt();
        if (width > 0) {
            if (sc.hasNextInt()) {
                heigth = sc.nextInt();
                if (heigth > 0) {
                    if (sc.hasNext()) {  //At this point the hasNext Statement blocks for //no reason till an Input is made.
                        charset = sc.next();
                        Image = new AsciiImage(width, heigth,charset);
                    } else {
                        ret = false;
                        System.out.println("INPUT MISMATCH");
                    }
                } ...//and so on

先谢谢,我在这个主题上找不到任何东西。 编辑:扫描程序被定义为一个System.in,但这应该不是问题 - 至少到目前为止它还没有。

3 个答案:

答案 0 :(得分:6)

通过Console或TextFile进行测试之间存在差异。如果我从Console读取,程序需要一个Stream,它将等待进一步的输入。

通过Textfile中的Input进行测试时(仍然使用System.in进行扫描程序,使用Java程序),hasNext()将在文件末尾返回false,因为无法再进行输入。

我无法在此主题上找到文档(在https://docs.oracle.com/javase/9/docs/api/java/util/Scanner.html#hasNext--中)。因此,如果有人找到正确和技术正确的答案,我会非常感激。

答案 1 :(得分:1)

我不确定,但以下是我自己的经验:
当Scanner对象被提供文件时,它不会被阻塞!
术语“用文件喂”是指扫描仪的构造如下:
Scanner scanner = new Scanner("myFile.txt");

但是,如果扫描程序是使用getInputStream()对象的Socket方法构建的,则如下所示:

input = socket.getInputStream();
Scanner scanner = new Scanner(input);

扫描仪会阻塞!

答案 2 :(得分:0)

如果您在等待用户输入时没有其他任何操作,则可以在该呼叫时阻止,直到下一个输入到达为止。

如果您确实想在等待输入时运行其他代码,请生成一个新线程并从那里调用hasNext和其他阻止扫描程序方法。