修复CSV转ArrayList时field.add()报错问题及正确返回实现
问题修复方案
错误根源
你遇到的编译错误源于三个核心问题:
- 未初始化要返回的
ArrayList<String>实例,整个方法里没有创建存储结果的容器 - 混淆了存储单个字段的String变量
field和ArrayList对象,String类本身没有add()方法,调用field.add()自然报错 - 方法最后试图返回String类型的
field,但方法声明的返回值是ArrayList<String>,类型完全不匹配
修正后的完整代码
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Scanner; public class CSVHandler { // 可替换为你自己的类名 /** * 此方法首先创建一个新的String类型ArrayList。然后将Scanner附加到提供的File对象,使用while循环逐行处理文件。对于每一行,此方法创建一个新的Scanner对象,以逗号","作为分隔符,通过第二个内部while循环访问行内的各个字段。处理每个字段时,使用从1开始的计数器变量进行跟踪。如果当前字段序号与指定的fieldFilter相等,则将该字段的String值添加到列表中。处理完文件所有行后,将ArrayList返回给调用者。 * * 实例化文件Scanner对象时若Scanner抛出FileNotFoundException,捕获该异常,显示错误信息,并立即以退出状态1终止程序。 * * @param database 包含待处理CSV数据库的File对象 * @param fieldFilter 用于构建列表的字段序号 * @return 表示数据库中目标列数据的String类型ArrayList。 */ public static ArrayList<String> buildListFromCSV(File database, int fieldFilter) { final int ERROR_CODE = 1; // 初始化存储结果的ArrayList ArrayList<String> targetList = new ArrayList<>(); try { Scanner fileScanner = new Scanner(database); while (fileScanner.hasNextLine()) { String line = fileScanner.nextLine(); Scanner lineScanner = new Scanner(line); lineScanner.useDelimiter(","); int fieldCounter = 1; while (lineScanner.hasNext()) { String field = lineScanner.next(); if (fieldCounter == fieldFilter) { // 将匹配的字段添加到ArrayList中 targetList.add(field); } fieldCounter++; } lineScanner.close(); } fileScanner.close(); } catch (FileNotFoundException e) { System.out.println("Unable to open file: " + database); System.exit(ERROR_CODE); } // 返回正确的ArrayList对象 return targetList; } }
关键修改说明
- 初始化结果容器:在方法开头创建
ArrayList<String> targetList = new ArrayList<>();,这是用来存储目标列数据的核心容器 - 修正添加逻辑:把错误的
field.add()替换为targetList.add(field),将当前匹配的字段字符串存入ArrayList - 修正返回值:最后返回
targetList而非String类型的field,完全符合方法的返回值声明 - (进阶提示)如果你的CSV存在带逗号的字段(如
"Alice, Smith"),用Scanner按逗号分割会破坏字段结构,建议使用专门的CSV解析库来处理这种场景
内容的提问来源于stack exchange,提问作者chriscondreay
相关产品推荐
相关产品推荐

