我正在尝试构建一个终端模式应用程序,允许用户输入某些属性作为对 80 年代发布的丰田汽车的过滤搜索。这是一个类的分配,因此存在一些限制,例如将原始数据保存在 CSV 文件中,并且数据必须加载到对象的 ArrayList 中(在我的例子中是丰田汽车)。我决定使用 BufferedReader 读取数据并将 CSV 文件中的值设置为实例化新车辆并将其添加到 ArrayList 的参数。
这是实现我刚才解释的方法:
public void load() {
toyotaVehicleCatalog = new ArrayList<>();
try(BufferedReader br = new BufferedReader(new FileReader("./src/files/80stoyota.csv"))) {
String line = "";
while((line = br.readLine()) != null) {
String[] fields = line.split(",");
int modelYear = Integer.parseInt(fields[0]);
String modelName = fields[1];
String modelCode = fields[2];
String modelEngine = fields[3];
boolean sedan = fields[4].length() > 0 ? true : false;
String funFact = fields[5];
ToyotaVehicle vehicle = new ToyotaVehicle(modelYear, modelName, modelCode, modelEngine, sedan, funFact);
toyotaVehicleCatalog.add(vehicle);
}
} catch(IOException ex) {
ex.printStackTrace();
}
for(int i = 0; i < toyotaVehicleCatalog.size(); i++) {
System.out.println(toyotaVehicleCatalog.get(i));
}
}
我的丰田车型:
public class ToyotaVehicle {
private String modelCode;
private int modelYear;
private String modelName;
private String engine;
private boolean sedan;
private String funFact;
public ToyotaVehicle(int modelYear, String modelName, String modelCode, String engine, boolean sedan, String funFact) {
this.modelCode = modelCode;
this.modelYear = modelYear;
this.modelName = modelName;
this.engine = engine;
this.sedan = sedan;
this.funFact = funFact;
}
public ToyotaVehicle() {
}
public String getModelCode() {
return modelCode;
}
public void setModelCode(String modelCode) {
this.modelCode = modelCode;
}
public int getModelYear() {
return modelYear;
}
public void setModelYear(int modelYear) {
this.modelYear = modelYear;
}
public String getModelName() {
return modelName;
}
public void setModelName(String modelName) {
this.modelName = modelName;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
public boolean isSedan() {
return sedan;
}
public void setSedan(boolean sedan) {
this.sedan = sedan;
}
public String getFunFact() {
return funFact;
}
public void setFunFact(String funFact) {
this.funFact = funFact;
}
}
当我运行代码时,我收到此错误消息:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at data.LoadData.load(LoadData.java:28) at Driver.main(Driver.java:7)
如果我在这里遗漏了一个明显的错误,我提前道歉。我唯一尝试过的是首先我使用
files[]
数组值作为直接参数,而不是为每个数组值设置变量,没有运气。我已经阅读了与同一问题相关的大多数论坛/帖子,但尚未找到解决方案。我之前使用过 BufferedReader 几次,但从未遇到过这个问题。任何帮助将不胜感激,谢谢。
输入文件中有一个空行。可能在最后。这会导致
.split(",")
的结果为零长度数组,从而在尝试 ArrayIndexOutOfBoundsException
时产生 fields[0]
。琐碎地
通过在循环中检查这一点:
while((line = br.readLine()) != null) {
if (line.isEmpty()) continue; // add this
String[] fields = line.split(",");
int modelYear = Integer.parseInt(fields[0]);
....
}