1

我不知道为什么我会收到 NoSuchElementException。我正在阅读的文件是 LF 终止的,这段代码已经在生产环境中运行了一年。在调试过程中,我的同事发现当文件以 LF 结尾并且长度正好为 1025 个字符时(尽管原始文件长度为 10132 个字符),您可以重现错误。这个错误在 Linux 和 Windows 上都可以重现,我尝试了 JDK 1.6.0_30、JRE 1.7 和 JDK 1.7.0_07。如果将 Pattern 更改为“~$?” 或“~\r?\n?” 错误消失了。

public static void main(String[] args) throws FileNotFoundException {
    String filepath = "file.txt";               
    Scanner s = null;
    try {
        s = new Scanner(new File(filepath));
        s.useDelimiter(Pattern.compile("~\n?", Pattern.UNIX_LINES));
        while (s.hasNext()) {
            System.out.println(s.next());
        }

    } finally {
        if (s != null)
            s.close();
    }
}

任何建议表示赞赏。

谢谢!

编辑 1我刚刚尝试了Scanner
的 GNU Classpath 实现,并且该版本的 Scanner 工作得很好。

4

1 回答 1

1

所以只是把这个关闭......如果您的扫描仪模式以可选的新行 \n 结尾?你可能会得到 NoSuchElementException。问题在于 Scanner 的实现,但有一些简单的解决方法:

  • 扫描行并应用您的正则表达式\n?
  • (?:\r?\n?)用;结束扫描 这是有效的,因为它强制扫描器在缓冲区中提取更多字符,从而跳过边缘情况。
  • 结束你的scan $?; 这会检测到行尾,但不会选择插入符号返回/新行。
于 2013-06-16T22:11:10.880 回答