2016-10-15 2 views
-1

나는 csv 파일을 사용하고 각 행을 자체 필드가있는 USCrimeClass 객체의 배열로 읽는 프로그램을 작성하고 있습니다. 나는 그 중 하나를 인쇄하여 배열이 올바르게 만들어 졌는지보고 싶지만 OutOfBounds 예외가 발생합니다. 여기 배열로 CSV 파일을 읽은 후 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]); 
     } 
    } 
} 

은 csv 파일이

1994,260327173,1130,3.7,3890,39.5,... 
1995,250692382,2478,21.5,2230,28.6,... 
1996,230492492,4092,22.8,3202,39.4... 

과 같아야 것입니다 그리고 여기이 코드에 관한 오류 메시지

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 
at USCrimeClass.<init>(USCrimeClass.java:30) 
at USCrimeClass.main(USCrimeClass.java:84) 
+0

이 예외는 어디에서 발생합니까? – UnholySheep

+0

Crime.csv 파일의 모양과 오류의 예를 들어 줄 수 있습니까? 나는 파일이 어떻게 보일지 추측하고 디버깅 할 예제를 만들려고 노력했지만, 확실히 알기는 어렵다. – BrainFRZ

+0

오류는 30 번과 84 번 줄에서 발생합니다. 배열이 만들어지면 건너 뛴 각 범주의 머리글이 표시되고 각 행마다 년, 인구 및 다중 범죄가 발생합니다 활동 및 발생 빈도 – Matt

답변

1

입니다 : 당신이 무엇을

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

여기서 파일 행을 읽는 중입니다. 줄 단위로 읽지 만 항상 lines을 현재 읽은 줄로 덮어 쓰게됩니다. 결국 lines에는 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<USCrimeClass> crimeClasses = new ArrayList<>(); 
read.nextLine(); 
while(read.hasNextLine()) 
{ 
    crimeClasses.add(new USCrimeClass(read.nextLine())); 
} 

read.close(); 

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

동의어 : read.close()를 finally { ... } 블록에 넣는 것이 좋습니다.

+0

감사합니다! 한 가지 더 질문. 배열 목록에서 지정된 항목의 연도를 반환하는 메서드를 만들고 싶다면 어떻게해야할까요? – Matt

+0

목록의 각 요소는 'USCrimeClass' 개체입니다. 따라서'crimeClasses.get (0)'은 메소드 호출이나 필드 접근을 할 수있는'USCrimeClass' 객체를 반환합니다. 'crimeClasses.get (0) .year'. 이 질문에 대한 대답이 있습니까? – Josef

+0

예. 다시 한 번 감사드립니다! – Matt

관련 문제