多文件读取至多个ArrayList异常:所有文件内容存入单列表
问题分析与修复方案
嘿,我来帮你定位代码里的问题!你的核心问题出在没有为每个文件创建对应的子ArrayList并添加到外层的data集合中,另外还有一些小细节可以优化,下面逐步拆解:
核心错误点
- 外层集合未初始化子列表:你初始化了
ArrayList<ArrayList<String>> data,但这个集合一开始是空的,没有任何子ArrayList。当你在第二个for循环里调用data.get(j).add(s)时,会直接抛出IndexOutOfBoundsException(如果没报错,可能是你实际运行的代码有临时修改,但逻辑上这是致命问题)。这也是为什么你会出现“所有内容存入同一个列表”的原因——如果侥幸没有报错,大概率是你之前误将同一个子列表重复添加到了data里。 - 路径拼接不够规范:手动用
file+"/"+files[i]拼接路径可能会因为系统分隔符差异出问题,建议用Java的File构造方法来处理。 - 跳过第一行的逻辑:代码里的
reader.readLine()会跳过每个文件的第一行,如果这不是你的业务需求,记得删掉这行。
修正后的代码
public ArrayList<ArrayList<String>> readFromFile() throws IOException { ArrayList<ArrayList<String>> data = new ArrayList<ArrayList<String>>(); String s = null; File directory = new File("/home/abed/Downloads/practical_database_java-StudentVers/practical_database_java/Database/Oracle"); String[] files = directory.list(); // 先做非空判断,避免目录为空或无法读取时出现空指针 if (files == null || files.length == 0) { return data; } for (int j = 0; j < files.length; j++) { // 用File构造方法规范拼接路径 File currentFile = new File(directory, files[j]); // 为当前文件创建一个新的子ArrayList,并添加到外层集合 ArrayList<String> fileContent = new ArrayList<>(); data.add(fileContent); try (BufferedReader reader = new BufferedReader(new FileReader(currentFile))) { // 如果不需要跳过第一行,就删掉下面这行 reader.readLine(); while ((s = reader.readLine()) != null) { fileContent.add(s); } } } return data; }
关键改动说明
- 新增了目录文件列表的非空判断,避免空指针异常。
- 每次处理文件前,创建新的
ArrayList<String>并添加到data中,确保每个文件对应独立的子列表。 - 用
new File(directory, files[j])来生成文件路径,更安全跨平台。 - 直接操作刚创建的子列表
fileContent,避免调用data.get(j)可能带来的索引问题。
这样修改后,每个文件的内容都会存入对应的独立ArrayList,while循环也会正常遍历每个文件的所有行啦。
内容的提问来源于stack exchange,提问作者Abed
相关产品推荐
相关产品推荐

