【问题标题】:Java: Arraylist out of bounds when processing file [duplicate]Java:处理文件时Arraylist超出范围[重复]
【发布时间】:2020-10-25 04:36:26
【问题描述】:

我正在尝试创建一个读取 .csv 文件的 ArrayList,将数据处理成 ArrayList,然后将列表打印出来。

到目前为止我的代码。

BankRecords 类

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() 方法会导致问题。

【问题讨论】:

  • Java 命名约定的类以大写字母开头;方法和变量以小写字母开头。这样可以更轻松地读取 Java 文件。
  • 我建议编辑它,这样所有文件都在它们自己的块中,以使其更具可读性。目前堆栈跟踪中的行号不是很有用

标签: java arrays csv exception


【解决方案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&lt;String&gt; rowData: BankArray) 循环中添加一个检查。例如,如果您期望 2 个字段,您可以编写如下内容:

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

HTH

【讨论】:

    猜你喜欢
    • 2021-03-28
    • 2020-02-13
    • 2014-03-10
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2021-12-10
    • 2019-03-25
    相关资源
    最近更新 更多