当前位置: 首页 > 面试题库 >

为什么hasNext()为False,而hasNextLine()为True?

龚迪
2023-03-14
问题内容

对于扫描仪对象,该hasNextLine()方法返回true,而该hasNext()方法返回false的结果又如何呢?

注意:根据输入文件,该hasNext()方法将按预期返回结果。在hasNextLine()似乎没有被返回正确的结果。

这是我正在运行的创建以下结果的代码:

public void ScannerTest(Reader fileReaderObject){
    Scanner scannerObj = new Scanner(fileReaderObject);

    for(int i = 1; scannerObj.hasNext(); i++){
        System.out.println(i + ": " + scannerObj.next());
        System.out.println("Has next line: " + scannerObj.hasNextLine());
        System.out.println("Has next: " + scannerObj.hasNext());
    }
    System.out.println();

    scannerObj.close();
}

输入文件

以下是我传递给此扫描仪的文件的实际内容:

a   3   9
b   3   6
c   3   3
d   2   8
e   2   5
f   2   2
g   1   7
h   1   4
i   1   1

结果

以下是我运行代码时控制台中显示的内容的结尾,其中包括我无法理解的部分:

25: i
Has next line: true
Has next: true
26: 1
Has next line: true
Has next: true
27: 1
Has next line: true
Has next: false

问题答案:

文件末尾有一个额外的换行符。

  • hasNextLine()检查linePattern缓冲区中是否还有另一个。
  • hasNext() 检查缓冲区中是否有可解析的令牌,由扫描仪的定界符分隔。

由于扫描程序的定界符是空格,并且linePattern也是空格,因此linePattern缓冲区中可能有一个a ,但没有可解析的标记。

通常,最常见的处理此问题的方法是始终nextLine()在解析文本每一行中的所有标记(例如数字)之后调用。在使用Scanner时也需要从中读取用户输入时执行此操作System.in。要使扫描仪越过此空格定界符,必须使用scanner.nextLine()清除行定界符。

附录:

LinePattern被定义为Pattern与此匹配的:

private static final String LINE_SEPARATOR_PATTERN =
                                       "\r\n|[\n\r\u2028\u2029\u0085]";
private static final String LINE_PATTERN = ".*("+LINE_SEPARATOR_PATTERN+")|.+$";

默认令牌定界符是这样的Pattern

private static Pattern WHITESPACE_PATTERN = Pattern.compile(
                                            "\\p{javaWhitespace}+");


 类似资料:
  • 对于scanner对象,方法返回true,而方法返回false,这是怎么回事? 注意:基于输入文件,方法按预期返回结果;似乎没有返回正确的结果。 下面是我正在运行的代码,它创建了以下结果: 以下是我要传递给此扫描仪的文件的实际内容: 以下是我运行代码时在控制台中打印的内容的结尾,包括我无法理解的部分:

  • 它仍然打印出10个“*”,但后来我得到了这个错误: 但是如果我使用hasNext而不是hasNextLine,它可以正常工作。 所以我想知道为什么hasNext有效,而hasNextLine无效。

  • 为什么以下输出为True? 这将始终输出,即使条件似乎表明并非如此。如果我删除括号,那么它可以工作,但我不明白为什么。

  • 罗马数字颠倒一百 拉丁文小写字母反转C 变成数字二 变成数字三 为什么Python认为这些不是数字?

  • 问题内容: 我正在尝试通过对象读取命令。为了检查输入语法,我使用了(对于缺少命令的情况)。在许多情况下,它确实可以正常工作,但是现在我有了JavaAPI中描述为“ MAY块并等待输入”的情况。 该方法什么时候阻止,我该如何控制?有趣的是,在块之前有3个案例,它工作得很好。另外,JavaAPI还描述了检查是否存在另一个Input的正确方法,以使该Method 不会产生。 这是我到目前为止所产生的代码

  • 我正在尝试通过对象读取命令。为了检查输入语法,我使用<code>sc。hasNext()(对于缺少命令的情况)。它已经在很多情况下运行良好,但现在我看到了JavaAPI中描述的“MAY block and wait for Input”的情况。 方法何时阻塞,我如何控制它?有趣的是,在街区前的3个案例中,它工作得非常好。此外,JavaAPI还将描述为检查是否存在另一个Input的正确方法,从而使方