对于扫描程序对象,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() 检查缓冲区中是否有可解析的 token ,由扫描仪的定界符分隔。

  • 由于扫描程序的定界符为空格,并且linePattern也是空格,因此缓冲区中可能有一个linePattern,但没有可解析的标记。
    通常,最常见的处理此问题的方法是,在解析文本每一行中的所有标记(例如数字)之后,始终调用nextLine()。从Scanner读取用户输入时,也需要在使用System.in时执行此操作。要使扫描仪越过此空格定界符,必须使用scanner.nextLine()清除行定界符。另请:Using 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+")|.+$";
    
    默认的 token 定界符是Pattern:
    private static Pattern WHITESPACE_PATTERN = Pattern.compile(
                                                "\\p{javaWhitespace}+");
    

    09-15 23:28