java - 无法通过 Apache commons csv 读取超过记录
问题描述
我有这样的csv文件:-
a,b,c,d //<- header
0.1,0.123,2.13,3.22
0.3,0.213,2.11,3.12
0.5,0.231,2.3,3.21
0.7,0.121,2.26,3.321
我正在使用 apache commons csv 来读取 csv 文件。
我已经制作了对应于上述 csv 文件的 POJO,并将其命名为 CSVInputFileModel 类。
以下是我用来读取文件的方法: -
private List<CSVInputFileModel> inputCSVData;
void fileParser() throws IOException {
Reader in = new FileReader(INPUT_CSV_FILE);
Iterable<CSVRecord> records = CSVFormat.RFC4180.withFirstRecordAsHeader().parse(in);
for (CSVRecord record : records) {
// Adding each record to array list
CSVInputFileModel csvInputFileModel = new CSVInputFileModel();
csvInputFileModel.setA(Double.parseDouble(record.get("a")));
csvInputFileModel.setB(Double.parseDouble(record.get("b")));
csvInputFileModel.setC(Double.parseDouble(record.get("c")));
csvInputFileModel.setD(Double.parseDouble(record.get("d")));
inputCSVData.add(csvInputFileModel); //<-- NPE at second iteration
}
System.out.println(inputCSVData);
}
下面是 CSVInputFileModel 类
public class CSVInputFileModel {
private double a;
private double b;
private double c;
private double d;
public CSVInputFileModel() {
}
//All args constructor
//hashcode equals
//getter setters
//toString
}
下面的代码给出了空指针异常。当我运行调试器时,我发现在第一次迭代中,apache csv commons能够读取csv 文件的第一条记录,而第二次迭代给出了空指针异常。
我无法弄清楚我做错了什么!
解决方案
首先,我确定您正在成功读取第一条记录,但不可能将其添加到列表中,因此:
- 您正在使用 Enhaced for 循环,这意味着第二条记录在那里,这不是您的问题。
CSVInputFileModel
似乎是对的。- 您声明了 inputCSVData 但未实例化。
我的结论是你错过了输入列表实例,这就是为什么进入第一次迭代,但从来没有进入第二次。
inputCSVData = new ArrayList<CSVInputFileModel>()
在尝试在代码中添加元素以修复它之前解决这个问题。
推荐阅读
- azure - 在 Azure 上工作但不在本地工作的 Docker 中的烧瓶
- javascript - 将尾随零添加到整数而不转换为JS中的字符串?
- git - 将两个相似的、未跟踪的目录合并到一个 git 存储库中
- javascript - 在 Electron 中异步运行函数的正确方法是什么?
- r - 理解 R 中的向量化代码
- java - 我正在尝试将内容作为字符串放入 ListView
- windows - 无法再使用 vsjitdebugger 在启动时调试进程
- class - Java将具有逗号分隔值的字符串列表转换为对象列表
- c++ - 标头保护文件中结构的重复符号
- java - 如何通过按键和释放来开始和结束循环?