Question

I'm making a simple program where I input 20 integer values from a text file into the 2D array. I obtained the row and column value through the first two values in the text file.

From what I understand, the IndexOutOfBoundsException means that my 2D array (4 rows and 5 columns):

  1. the values are larger than the array size- not possible because there are only 20 values.
  2. there are not enough values to fill the array- ^ reason

What am I missing? Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0

public class Practice {

public static void main(String[] args){
    int[][] thisArray=fillArray(args[0]);
    print(thisArray,thisArray.length);
}

public static int[][] fillArray(String myFile){
    TextFileInput in= new TextFileInput(myFile);
    String r=in.readLine();//4 rows
    String c=in.readLine();//5 columns
    int row=Integer.parseInt(r);//parse from string to int
    int col=Integer.parseInt(c);
    int[][] tempArray=new int[row][col];

    for(int fillRow=0; fillRow<row;fillRow++){
        for(int fillCol=0; fillCol<col;fillCol++){
            String temp= in.readLine();
            tempArray[fillRow][fillCol]=Integer.parseInt(temp);
        }
    }
    return tempArray;//return 2D array
}

public static void print(int[][] array,int length){
    for(int r=0;r<length;r++){
        for(int c=0;c<array[r].length;c++){
            System.out.print(array[r][c]);
        }
        System.out.println();
    }
}
}

textfile:(1 number per line) 4 5 1 3 5 7 12 34 56 78 21 44 36 77 29 87 48 77 25 65 77 2

Was it helpful?

Solution

I'd be willing to bet you're not passing the name of your data file to your program.

if args.length == 0 then args[0] throws ArrayIndexOutOfBoundsException

That's about the only way you can get that error on that line.

OTHER TIPS

Your code looks fine, but I think you have to check the values of row and col before

int[][] tempArray=new int[row][col];

Most probably, that's where the error is.

UPDATE - bingo. it's

fillArray(args[0])

you're not passing any parameter to your program.

try instead

fillArray("c:\\path\\to\\my\\file.txt");

I'd do it more like this:

package cruft;

import org.apache.commons.lang3.StringUtils;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

/**
 * ArrayDemo
 * @author Michael
 * @link http://stackoverflow.com/questions/22029021/java-array-index-out-of-bounds-exception
 * @since 2/25/14 7:18 PM
 */
public class ArrayDemo {
    public static void main(String[] args) {
        Reader reader = null;
        try {
            if (args.length > 0) {
                reader = new FileReader(args[0]);
                int[][] thisArray = fillArray(reader);
                for (int i = 0; i < thisArray.length; ++i) {
                    for (int j = 0; j < thisArray[0].length; ++j) {
                        System.out.println(String.format("[%5d, %5d]: %5d", i, j, thisArray[i][j]));
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            close(reader);
        }
    }

    private static void close(Reader reader) {
        try {
            if (reader != null) {
                reader.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static int[][] fillArray(Reader reader) throws IOException {
        int [][] array;
        BufferedReader br = new BufferedReader(reader);
        String line;
        int maxRows = Integer.parseInt(br.readLine());
        int maxCols = Integer.parseInt(br.readLine());
        array = new int[maxRows][maxCols];
        int i = 0;
        int j = 0;
        while ((line = br.readLine()) != null) {
            if (StringUtils.isNotBlank(line) && !line.startsWith("#")) {
                array[i][j++] = Integer.parseInt(line);
                if (j == maxCols) {
                    ++i;
                    j = 0;
                }
            }
        }
        return array;
    }
}

Here's the input file I used: first value is # rows, second is # cols, the rest are the matrix values.

2
3

# first row
1
2
3

# second row
4
5
6

Here's the output I got with a simple file, one value per line. I read in a 2x3 matrix:

[    0,     0]:     1
[    0,     1]:     2
[    0,     2]:     3
[    1,     0]:     4
[    1,     1]:     5
[    1,     2]:     6

Process finished with exit code 0
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top