arrays Java:Arraylist在处理文件时超出范围
我正在尝试创建一个ArrayList,它读取。csv文件,将数据处理到ArrayList中,然后打印出列表
我的代码到目前为止
银行记录类
import java.io.*;
import java.util.*;
public class BankRecords
{
String sex, region, married, save_act, current_act, mortgage, pep;
int children;
double income;
private String id;
private int age;
public BankRecords(String gender, String area, String marriage, String SaveAccount, String CurrentAccount, String HouseBill, String pepp, int minors, double paycheck, String identification, int years)
{
this.sex = gender;
this.region = area;
this.married = marriage;
this.save_act = SaveAccount;
this.current_act = CurrentAccount;
this.mortgage = HouseBill;
this.pep = pepp;
this.children = minors;
this.income = paycheck;
this.id = identification;
this.age = years;
}
public String getId()
{
return id;
}
public void setId(String id)
{
this.id = id;
}
public String getSex()
{
return sex;
}
public void setSex(String sex)
{
this.sex = sex;
}
public String getRegion()
{
return region;
}
public void setRegion(String region)
{
this.region = region;
}
public String getMarried()
{
return married;
}
public void setMarried(String married)
{
this.married = married;
}
public String getSave_act()
{
return save_act;
}
public void setSave_act(String save_act)
{
this.save_act = save_act;
}
public String getCurrent_act()
{
return current_act;
}
public void setCurrent_act(String current_act)
{
this.current_act = current_act;
}
public String getMortgage()
{
return mortgage;
}
public void setMortgage(String mortgage)
{
this.mortgage = mortgage;
}
public String getPep()
{
return pep;
}
public void setPep(String pep)
{
this.pep = pep;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public int getChildren()
{
return children;
}
public void setChildren(int children)
{
this.children = children;
}
public double getIncome()
{
return income;
}
public void setIncome(double income)
{
this.income = income;
}
}
客户端抽象类
import java.io.*;
import java.util.*;
public abstract class Client
{
static ArrayList<List<String>> BankArray = new ArrayList<>(25);
static BankRecords robjs[] = new BankRecords[600];
public static void readData()
{
try
{
BufferedReader br;
String filepath = "C:\\Users\\eclipse-workspace\\Bank_Account\\src\\bank-Detail.csv";
br = new BufferedReader(new FileReader (new File(filepath)));
String line;
while ((line = br.readLine()) != null)
{
BankArray.add(Arrays.asList(line.split(",")));
}
}
catch (Exception e)
{
e.printStackTrace();
}
processData();
}
public static void processData()
{
int idx=0;
for (List<String> rowData: BankArray)
{
robjs[idx] = new BankRecords(null, null, null, null, null, null, null, idx, idx, null, idx);
robjs[idx].setId(rowData.get(0));
robjs[idx].setAge(Integer.parseInt(rowData.get(1)));
idx++;
}
printData();
}
public static void printData()
{
System.out.println("ID\tAGE\tSEX\tREGION\tINCOME\tMORTGAGE");
int final_record = 24;
for (int i = 0; i < final_record; i++)
{
System.out.println(BankArray.get(i) + "\t ");
}
}
}
BankRecordsTest类(扩展客户端)
import java.util.*;
import java.io.*;
public class BankRecordsTest extends Client
{
public static void main(String args [])
{
readData();
}
}
错误
这里是错误
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at java.util.Arrays$ArrayList.get(Unknown Source)
at Client.processData(Client.java:33)
at Client.readData(Client.java:24)
at BankRecordsTest.main(BankRecordsTest.java:7)
我不确定索引问题是什么。请注意,如果分别运行ReadData()
和PrintData()
函数,代码运行正常,但ProcessData()
方法会导致问题
# 1 楼答案
我认为您的数据可能不干净,您正在对数组的长度进行假设。您得到的错误源于此行:
显然,rowData没有2项(或更多项)。这就是你得到
ArrayIndexOutOfBoundsException
的原因。因此,您需要检查变量的初始化位置。你很快就会意识到它来自哪里那么,下面的问题是
BankArray
在哪里初始化。这在两个地方发生。首先您正在创建一个空列表。到现在为止,一直都还不错。请注意,您不需要(因此也不应该)使用大小进行初始化。列表不像数组,因为它们可以很容易地增长,您不需要预先给出它们的大小
第二名是
这可能就是问题的根源。您的
row
变量包含Arrays.asList(line.split(","))
的结果。因此,该列表的大小取决于您正在读取的字符串中逗号的数量。如果没有任何逗号,则大小将为1(字符串本身的值)。这就是我得出结论的原因,你有一个数据质量问题您真正应该做的是在
for (List<String> rowData: BankArray)
循环中添加一个检查。例如,如果您需要两个字段,则可以按照以下行编写:嗯