You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Scanner跳过换行符?读取文本文件抛NoSuchElementException求解

Scanner读取换行分隔字符的异常与空元素问题

问题根源分析

你的代码存在几个关键问题:

  • Scanner对象未初始化,只声明了变量却没有通过new Scanner(file)创建实例,这是基础错误。
  • scanner.skip("\n")直接调用会触发NoSuchElementException:当文件开头没有换行,或者循环到末尾没有剩余换行时,skip找不到匹配字符就会抛异常。
  • useDelimiter("")放在循环内部完全冗余,应该在创建Scanner后一次性设置,让它逐个读取字符。

修正方案(推荐)

直接读取所有字符,过滤掉换行/回车符,既安全又简洁:

File file = new File("src/crossword/squares/" + Crossword + ".txt");
ArrayList<String> values = new ArrayList<>();
try (Scanner scanner = new Scanner(file)) { // 自动关闭资源,避免内存泄漏
    scanner.useDelimiter(""); // 设置空分隔符,逐个读取每个字符
    while (scanner.hasNext()) {
        String value = scanner.next();
        // 过滤掉换行符(\n)和回车符(\r,兼容Windows换行格式)
        if (!"\n".equals(value) && !"\r".equals(value)) {
            values.add(value);
        }
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

另一种方案(基于skip的改进)

如果一定要用skip,可以用正则匹配任意数量的换行/回车,避免找不到匹配的异常:

File file = new File("src/crossword/squares/" + Crossword + ".txt");
ArrayList<String> values = new ArrayList<>();
try (Scanner scanner = new Scanner(file)) {
    scanner.useDelimiter("");
    // 先处理第一个字符,避免开头无换行的情况
    if (scanner.hasNext()) {
        String firstChar = scanner.next();
        if (!"\n".equals(firstChar) && !"\r".equals(firstChar)) {
            values.add(firstChar);
        }
    }
    // 跳过任意数量的换行/回车,再读取有效字符
    while (scanner.hasNext()) {
        scanner.skip("[\n\r]*"); // *允许0次匹配,不会抛异常
        if (scanner.hasNext()) {
            values.add(scanner.next());
        }
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

内容的提问来源于stack exchange,提问作者user22737329

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 22:03:16