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

使用ResourceLoader加载文本文件时触发NoSuchElementException问题排查

解决Jar包中ResourceLoader读取文本文件时的NoSuchElementException问题

嘿,我看了你的代码和问题描述,很快就定位到了几个关键问题,咱们一步步来解决:

首先,你的morse类里有个明显的笔误——temp.symbol = f.n;这行代码根本没法运行,f.n不是Scanner的合法方法,你肯定是想写f.next()对吧?这是第一个要修正的点。

接下来就是导致NoSuchElementException的核心原因:你在循环里每次要读取两个元素(字符+摩尔斯符号),但只通过while(f.hasNext())做了一次存在性检查。假设你的文本文件最后恰好剩下单个元素(比如不小心多了个空格或者漏了符号),当你读完字符后再去读符号时,Scanner已经没有下一个元素了,自然就抛出异常。

还有个小细节:手动调用f.close()有资源泄漏的风险,如果循环中途抛出异常,close方法可能不会执行,用try-with-resources语法可以自动帮你关闭资源,更安全。

修复后的morse类代码

import java.util.ArrayList;
import java.util.Scanner;

final public class morse {
    String c;
    String symbol;

    public static void load(ArrayList<morse> mkey) {
        // try-with-resources自动关闭Scanner,避免资源泄漏
        try (Scanner f = new Scanner(ResourceLoader.rload("morse key.txt"))) {
            while (f.hasNext()) {
                morse temp = new morse();
                // 读取字符
                temp.c = f.next();
                // 读取符号前必须再次检查是否有元素,防止末尾出现孤立字符
                if (!f.hasNext()) {
                    System.err.println("格式错误:字符 " + temp.c + " 缺少对应的摩尔斯符号");
                    break;
                }
                temp.symbol = f.next();
                mkey.add(temp);
                System.out.println(temp.c + " -> " + temp.symbol);
            }
        }
    }
}

额外优化建议

你的ResourceLoader类可以简化,不需要创建实例,直接用类本身的getResourceAsStream方法更高效:

import java.io.InputStream;

final public class ResourceLoader {
    public static InputStream rload(String path) {
        return ResourceLoader.class.getResourceAsStream(path);
    }
}

最后要注意的点

  • 确保morse key.txt的路径正确:如果文件和你的类在同一个包下,路径直接写"morse key.txt";如果在Jar包的根目录,路径开头可以加个斜杠"/morse key.txt"。
  • 检查你的文本文件格式:保证每个字符都对应一个摩尔斯符号,没有多余的空白或孤立的字符,比如最后一行不要只留一个字符就结束。

这样修改后,你的循环就能正常运行,不会再抛出NoSuchElementException啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:09:24