Java 将csv文件读入数组后获取边界外异常

Java 将csv文件读入数组后获取边界外异常,java,arrays,csv,indexoutofboundsexception,Java,Arrays,Csv,Indexoutofboundsexception,我正在编写一个程序,它接受一个csv文件,并将每一行读入一个USCrimeClass对象数组,这些对象有自己的字段。我想通过打印其中一个数组来查看数组是否正确生成,但我得到了一个OutOfBounds异常 import java.io.*; import java.util.*; public class USCrimeClass { public int year; public int population; public int violentCrime;

我正在编写一个程序,它接受一个csv文件,并将每一行读入一个USCrimeClass对象数组,这些对象有自己的字段。我想通过打印其中一个数组来查看数组是否正确生成,但我得到了一个OutOfBounds异常

import java.io.*;
import java.util.*;
public class USCrimeClass
{
    public int year;
    public int population;
    public int violentCrime;
    public double violentCrimeRate;
    public int manslaughter;
    public double manslaughterRate;
    public int rape;
    public double rapeRate;
    public int robbery;
    public double robberyRate;
    public int assault;
    public double assaultRate;
    public int propertyCrime;
    public double propertyCrimeRate;
    public int burglary;
    public double burglaryRate;
    public int larcenyTheft;
    public double larcenyTheftRate;
    public int vehicleTheft;
    public double vehicleTheftRate;

    public USCrimeClass(String line)
    {
        String[]split=line.split(",");
        year=Integer.parseInt(split[0]);
        population=Integer.parseInt(split[1]);
        violentCrime=Integer.parseInt(split[2]);
        violentCrimeRate=Double.parseDouble(split[3]);
        manslaughter=Integer.parseInt(split[4]);
        manslaughterRate=Double.parseDouble(split[5]);
        rape=Integer.parseInt(split[6]);
        rapeRate=Double.parseDouble(split[7]);
        robbery=Integer.parseInt(split[8]);
        robberyRate=Double.parseDouble(split[9]);
        assault=Integer.parseInt(split[10]);
        assaultRate=Double.parseDouble(split[11]);
        propertyCrime=Integer.parseInt(split[12]);
        propertyCrimeRate=Double.parseDouble(split[13]);
        burglary=Integer.parseInt(split[14]);
        burglaryRate=Double.parseDouble(split[15]);
        larcenyTheft=Integer.parseInt(split[16]);
        larcenyTheftRate=Double.parseDouble(split[17]);
        vehicleTheft=Integer.parseInt(split[18]);
        vehicleTheftRate=Double.parseDouble(split[19]);
    }

    public static void main(String[] args)
    {
        Scanner read = null;
        {
            try
            {
                read=new Scanner(new File("C:\\Crime.csv"));
            }
            catch(FileNotFoundException e)
            {
                System.out.println("The file can't be opened");
                System.exit(0);
            }



            String[] lines = null;

            read.nextLine();
            while(read.hasNextLine())
            {
                lines=read.nextLine().split(",");
            }

            USCrimeClass[] CrimeYear=new USCrimeClass[lines.length];

            for(int i=0;i<lines.length;i++)
            {
                CrimeYear[i]=new USCrimeClass(lines[i]);
            }
            read.close();

            System.out.println(CrimeYear[0]);
        }
    }
}
下面是错误消息

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at USCrimeClass.<init>(USCrimeClass.java:30)
at USCrimeClass.main(USCrimeClass.java:84)
线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常:1 在USCrimeClass。(USCrimeClass.java:30) 位于USCrimeClass.main(USCrimeClass.java:84) 关于此代码:

while(read.hasNextLine())
{
    lines = read.nextLine().split(",");
}
您在这里所做的是逐行读取文件,但总是用当前读取的行覆盖
行。最后,
将只包含最后一行的拆分内容,而不是csv文件中的所有行

将每个读取行添加到列表中,然后此操作应能正常工作:

List<String> lines = new ArrayList<>();

read.nextLine();
while(read.hasNextLine())
{
    lines.add(read.nextLine());
}

USCrimeClass[] CrimeYear = new USCrimeClass[lines.size()];

for(int i=0;i<lines.size();i++)
{
    CrimeYear[i]=new USCrimeClass(lines.get(i));
}
read.close();
List line=new ArrayList();
read.nextLine();
while(read.hasNextLine())
{
line.add(read.nextLine());
}
USCrimeClass[]CrimeYear=新的USCrimeClass[lines.size()];

对于(int i=0;iSo此异常发生在何处?能否举例说明Crime.csv文件应该是什么样子以及错误来自何处?我尝试猜测该文件应该是什么样子,并制作了自己的示例进行调试,但很难确定。错误发生在第30行和第84行。至于它看起来是什么样子,它有每个类别的标题(创建数组时跳过),那么对于每一行,它都有年份、人口和多个犯罪活动以及它们的发生率谢谢!还有一个问题;如果我想创建一个方法来返回数组列表中指定项的年份,我将如何执行?列表中的每个元素都是
USCrimeClass
对象。所以
crimeClasses.get(0)
返回一个
USCrimeClass
对象,您可以在该对象上调用它的方法或访问它的字段,例如
crimeClasses.get(0).year
。这回答了您的问题吗?是的。再次感谢!
List<String> lines = new ArrayList<>();

read.nextLine();
while(read.hasNextLine())
{
    lines.add(read.nextLine());
}

USCrimeClass[] CrimeYear = new USCrimeClass[lines.size()];

for(int i=0;i<lines.size();i++)
{
    CrimeYear[i]=new USCrimeClass(lines.get(i));
}
read.close();
List<USCrimeClass> crimeClasses = new ArrayList<>();
read.nextLine();
while(read.hasNextLine())
{
    crimeClasses.add(new USCrimeClass(read.nextLine()));
}

read.close();

System.out.println(crimeClasses.get(0));