ninesalt
ninesalt

Reputation: 4354

Array Index out of bounds when reading from CSV file

I'm trying to read a CSV file using a BufferedReader, but for some reason I get an out of bounds exception after 7 rows. I tried this exact algo on another CSV file (30 rows) and it worked fine. Here is the CSV file in question.

    String spellPath = "file path is here";

    FileReader y = new FileReader(spellPath);
    BufferedReader x = new BufferedReader(y);
    ArrayList<Card> ArrayList = new ArrayList<Card>( );   //dynamic data type

    for( String p = x.readLine(); p != null ; p = x.readLine()){

        String [] stArray = p.split(",");
        ArrayList.add(new Card( stArray[1], stArray[2])); //new card with name and desc only

    }

    System.out.println(ArrayList.toString());

Is the problem with the file or is it with the algorithm?

Upvotes: 0

Views: 6590

Answers (6)

evomiester
evomiester

Reputation: 41

Your issue here is the 2 consecutive calls to p=x.readLine()

for( String p = x.readLine(); p != null ; p = x.readLine()){
    ...
}

Due to this, 2 lines are read and only 1 is checked for null

You need to change the loop to

while (true) {
    String p= x.readLine();
    if (p == null) break;

    ...
}

Upvotes: 3

Robin Chander
Robin Chander

Reputation: 7415

You are calling x.readLine()twice in the loop. Hence you are skipping lines while reading.

Better way would be to use CSVReader rather than the buffered reader.

CSVReader reader = new CSVReader(new FileReader(fName), ',','"','|');
    List content = reader.readAll();//do not use this if CSV file is large
    String[] row = null;

    for (Object object : content) {
        row = (String[]) object;
        row = Arrays.toString(row).split(",");
        //now you have a row array with length equal to number of columns
    }

Here is the link to get CSVReader - CSVReader Download

Upvotes: 1

Jens
Jens

Reputation: 69440

There is one line "gains 500 ATK and DEF for each Spell Card you have on the field." that do not contain any ,. So stArray[] has a length of 1.

Other thing: Java arrays are zero base.

And for( String p = x.readLine(); p != null ; p = x.readLine()){ should be while ((String p = x.readLine())!= null ){

Upvotes: 2

Bhargav Modi
Bhargav Modi

Reputation: 2655

while((String p = x.readLine()) != null){

    String [] stArray = p.split(",");
    ArrayList.add(new Card( stArray[0], stArray[1])); //new card with name and desc only

}

System.out.println(ArrayList.toString());

this should works

Upvotes: 1

Rahul T
Rahul T

Reputation: 88

Try this.

while(x.readLine() != null){
---`enter code here`
}

Upvotes: 1

Fahim
Fahim

Reputation: 12358

Error is throwing here

String [] stArray = p.split(",");
 ArrayList.add(new Card( stArray[1], stArray[2]));

Add this condition and check

String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[0], stArray[1]));

Upvotes: 0

Related Questions