当前位置: 首页 > 知识库问答 >
问题:

为什么hasNext()为假,而hasNextLine()为真?

贲绪
2023-03-14

对于scanner对象,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

共有3个答案

茹元魁
2023-03-14

文件末尾有一个空行。

例如,如果您将内容保存到一个txt文件中,一些编辑器会在文件中添加一个空的新行。

编辑器的行为是这样的,因为这是POSIX标准的一部分:

3.206线路

零个或多个非字符加上一个终止字符的序列。

这个话题已经在这篇文章中讨论过了。

以下是Java 8 Scanner类的文档。

hasNext()

如果此扫描仪的输入中有另一个标记,则返回true。

hasNextLine()

如果此扫描仪的输入中有另一行,则返回true。

由于上述事实,hasNextLine()将返回true,但hasNext()找不到任何可以识别为标记的内容,因此返回false

更多信息请参见durron597帖子。

龙霖
2023-03-14

原因是hasNext()检查是否还有更多可用的非空格字符。hasNextLine()检查是否有另一行文本可用。您的文本文件末尾可能有一个换行符,因此它有另一行,但没有更多的非空格字符。

如果文件末尾没有换行符,许多文本编辑器会自动在文件末尾添加换行符。

换句话说,您的输入文件不是这样的(数字是行号):

1. a   3   9
2. b   3   6
3. c   3   3
4. d   2   8
5. e   2   5

实际上是这样的:

1. a   3   9
2. b   3   6
3. c   3   3
4. d   2   8
5. e   2   5
6. 
洪成济
2023-03-14
  • hasNextLine()检查缓冲区中是否有另一个linePattern
  • hasNext()检查缓冲区中是否有可解析的标记,由扫描仪的分隔符分隔。

由于扫描仪的分隔符是空白,linePattern也是空白,因此缓冲区中可能存在linePattern,但没有可解析的标记。

通常,处理此问题的最常见方法是在解析文本每行中的所有标记(例如数字)后始终调用nextLine()。当使用ScannerS读取用户输入时,您需要执行此操作ystem.in。要使扫描仪前进超过此空格分隔符,您必须使用scanner.nextLine()来清除行分隔符。请参阅:使用scanner.next()

附录:

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}+");
 类似资料:
  • 问题内容: 题 对于扫描仪对象,该方法返回true,而该方法返回false的结果又如何呢? 注意:根据输入文件,该方法将按预期返回结果。在似乎没有被返回正确的结果。 码 这是我正在运行的创建以下结果的代码: 输入文件 以下是我传递给此扫描仪的文件的实际内容: 结果 以下是我运行代码时控制台中显示的内容的结尾,其中包括我无法理解的部分: 问题答案: 文件末尾有一个额外的换行符。 检查缓冲区中是否还有

  • 问题内容: 我遇到了一个问题,即使它可以与他人正常工作,也无法使java.util.Scanner读取保存在记事本中的文本文件。基本上,当它尝试读取问题文件时,它完全是空手的- hasNextLine()为false,缓冲区为空,等等。我将其范围缩小到一个事实,即如果存在,它甚至不会读取第一行是文件中 任何地方 的卷曲报价。没有异常被抛出。请注意,同一文件上的BufferedReader没问题。

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

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

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

  • <代码>文档。all是DOM中的一个非原始对象,它是falsy。 例如,此代码不做任何事情: 有人能解释一下这是为什么吗?