有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    我认为您的数据可能不干净,您正在对数组的长度进行假设。您得到的错误源于此行:

            robjs[idx].setAge(Integer.parseInt(rowData.get(1))); 
    

    显然,rowData没有2项(或更多项)。这就是你得到ArrayIndexOutOfBoundsException的原因。因此,您需要检查变量的初始化位置。你很快就会意识到它来自哪里

    for (List<String> rowData: BankArray)
    

    那么,下面的问题是BankArray在哪里初始化。这在两个地方发生。首先

        static ArrayList<List<String>> BankArray = new ArrayList<>(25); 
    

    您正在创建一个空列表。到现在为止,一直都还不错。请注意,您不需要(因此也不应该)使用大小进行初始化。列表不像数组,因为它们可以很容易地增长,您不需要预先给出它们的大小

    第二名是

    BankArray.add(Arrays.asList(line.split(",")));
    

    这可能就是问题的根源。您的row变量包含Arrays.asList(line.split(","))的结果。因此,该列表的大小取决于您正在读取的字符串中逗号的数量。如果没有任何逗号,则大小将为1(字符串本身的值)。这就是我得出结论的原因,你有一个数据质量问题

    您真正应该做的是在for (List<String> rowData: BankArray)循环中添加一个检查。例如,如果您需要两个字段,则可以按照以下行编写:

    if (rowData.size()<2){
        throw new Exception("hmmm there's been a kerfuffle');
    }