Java 将csv文件读入数组后获取边界外异常
我正在编写一个程序,它接受一个csv文件,并将每一行读入一个USCrimeClass对象数组,这些对象有自己的字段。我想通过打印其中一个数组来查看数组是否正确生成,但我得到了一个OutOfBounds异常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;
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));