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

读取文本文件时触发java.util.NoSuchElementException异常求助

解决java.util.NoSuchElementException: No line found异常

问题原因

你的代码抛出异常的核心原因有两点:

  • 自定义分隔符\|未包含换行符,导致第三个next()会读取字段内容+换行符,且后续调用nextLine()时,在处理完最后一行后,没有剩余行可读取,触发NoSuchElementException。
  • 最后一行读取完三个字段后,Scanner指针已到文件末尾,itemReader.nextLine()无行可读,直接抛出异常。

解决方案

方法一:按行读取+拆分字段(推荐,更健壮)

先逐行读取文件内容,再将每行按|拆分,这种方式能更好地处理格式异常和空行:

File itemFile = new File("src/items.txt");
// 使用try-with-resources自动关闭Scanner,避免资源泄漏
try (Scanner itemReader = new Scanner(itemFile)) {
    while (itemReader.hasNextLine()) {
        String line = itemReader.nextLine();
        // 跳过空行
        if (line.trim().isEmpty()) {
            continue;
        }
        // 按|拆分每行内容
        String[] parts = line.split("\\|");
        // 确保每行有3个字段,避免格式错误
        if (parts.length == 3) {
            String itemName = parts[0].trim();
            String itemDesc = parts[1].trim();
            String itemLocation = parts[2].trim();
            
            Item item = new Item(itemName, itemDesc, itemLocation);
            Item.addItem(item);
        } else {
            System.out.println("无效的行格式:" + line);
        }
    }
} catch (FileNotFoundException e) {
    System.out.println("未找到Items.txt文件");
}

方法二:调整Scanner分隔符,移除nextLine()

修改分隔符,同时匹配|和换行符,让Scanner自动处理换行,无需手动调用nextLine():

File itemFile = new File("src/items.txt");
Scanner itemReader = null;
try {
    itemReader = new Scanner(itemFile);
    // 分隔符匹配|或换行(\r?\n兼容Windows/Linux换行)
    itemReader.useDelimiter("\\||\\r?\\n");
    while (itemReader.hasNext()) {
        String itemName = itemReader.next().trim();
        // 提前检查是否有下一个字段,避免字段缺失导致异常
        if (!itemReader.hasNext()) break;
        String itemDesc = itemReader.next().trim();
        if (!itemReader.hasNext()) break;
        String itemLocation = itemReader.next().trim();

        Item item = new Item(itemName, itemDesc, itemLocation);
        Item.addItem(item);
    }
} catch (FileNotFoundException e) {
    System.out.println("未找到Items.txt文件");
} finally {
    if (itemReader != null) {
        itemReader.close();
    }
}

额外建议

  • 优先使用try-with-resources语法,它会自动关闭实现了AutoCloseable接口的资源(比如Scanner),避免手动关闭时可能出现的资源泄漏。
  • 处理文件时,增加格式校验(比如检查字段数量),能有效避免因文件内容异常导致的程序崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:00:24