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
相关产品推荐
相关产品推荐

