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

Java读取txt文件时String转数值类型异常、对象无法存入链表问题求助

问题修复方案

1 数值转换异常问题修复

你目前的代码最核心的问题是异常捕获粒度太粗,完全无法定位具体错误原因,其次没有对读取的文本内容做基础校验,触发异常后你只能看到统一的文件打开错误提示,根本不知道实际报错点:

  • 所有从split结果里取的字段必须先调用trim()去除前后空格,文本文件导出/编写时很容易在字段前后留下空格,带空格的数字字符串直接调用parseInt/parseDouble一定会抛出格式异常
  • 先校验split后的数组长度是否为11,避免某行格式错误导致数组越界,你之前的代码遇到这种情况会直接触发外层catch,你根本不知道是行格式不对
  • 给数值转换逻辑单独加NumberFormatException捕获,打印当前行号和对应字段的实际值,直接就能定位到哪个字段格式有问题
  • 外层捕获只针对文件IO异常,不要和业务逻辑的异常混在一起

2 链表无法保存对象问题修复

  • 首先确认你自定义链表的addNode方法实现是否正确,常见问题包括尾指针没有正确赋值、新增节点没有挂载到链表上、静态变量冲突导致每次add都覆盖前一个节点,可以在addNode执行后打印当前链表的长度确认是否添加成功
  • 加载文件前先清空链表,避免多次加载导致数据重复或者链表逻辑异常

修复后参考代码

private void readFile() {
    BufferedReader in;
    String line = "";
    // 加载前清空原有链表数据,避免重复累加
    dogsList.clear();
    try {
        in = new BufferedReader(new FileReader("Doggie.txt"));
        line = in.readLine();
        int lineNum = 0; // 记录行号,方便定位错误行
        while (line != null) {
            lineNum++;
            String[] lineArray = line.split(",");
            // 校验当前行字段数量是否符合要求
            if (lineArray.length != 11) {
                System.out.printf("第%d行字段数量不足,跳过该行,内容为:%s%n", lineNum, line);
                line = in.readLine();
                continue;
            }
            // 所有字段先去除前后空格
            String name = lineArray[0].trim();
            String a = lineArray[1].trim();
            String phone = lineArray[2].trim();
            String location = lineArray[3].trim();
            String p = lineArray[4].trim();
            String id = lineArray[5].trim();
            String dogName = lineArray[6].trim();
            String breed = lineArray[7].trim();
            String w = lineArray[8].trim();
            String t = lineArray[9].trim();
            String vet = lineArray[10].trim();

            try {
                int age = Integer.parseInt(a);
                double payment = Double.parseDouble(p);
                double weight = Double.parseDouble(w);
                int times = Integer.parseInt(t);

                Dog doggo = new Dog(name, phone, location, payment, id, dogName, breed, age, weight, times, vet);
                dogsList.addNode(doggo);
            } catch (NumberFormatException e) {
                // 打印转换失败的具体信息,直接定位问题
                System.out.printf("第%d行数值转换失败,对应字段值:age=%s、payment=%s、weight=%s、times=%s,错误详情:%s%n",
                        lineNum, a, p, w, t, e.getMessage());
            }
            line = in.readLine();
        }
        DogsLoaded = true;
        // 加载完成后打印链表长度,确认是否加载成功
        System.out.printf("文件加载完成,共成功加载%d条Dog数据%n", dogsList.size());
        in.close();
    } catch (Exception e) {
        JOptionPane.showMessageDialog(this, "文件打开失败,请检查文件路径和权限", "错误!", JOptionPane.ERROR_MESSAGE);
        e.printStackTrace();
    }
}

后续排查步骤

运行修改后的代码,查看控制台打印的错误信息:

  • 如果是字段格式错误,直接修改Doggie.txt中对应行的内容即可
  • 如果转换全部正常但链表长度为0,直接排查addNode方法的实现逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:54:04