Исключение Java-индекса массива за пределами границ

StackOverflow https://stackoverflow.com//questions/22029021

Вопрос

Я создаю простую программу, в которой ввожу 20 целочисленных значений из текстового файла в двумерный массив.Я получил значение строки и столбца через первые два значения в текстовом файле.

Насколько я понимаю, IndexOutOfBoundsException означает, что мой 2D-массив (4 строки и 5 столбцов):

  1. Значения больше размера массива- невозможно, потому что существует только 20 значений.
  2. Недостаточно значений, чтобы заполнить разум

Что мне не хватает? 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 номер на строку) 4 5 1 3 5 7 7 12 34 56 78 21 44 36 77 29 87 48 77 25 65 77 2

Это было полезно?

Решение

Я готов поспорить, что вы не передаете имя файла данных в свою программу.

если args.length == 0 затем args[0] бросает ArrayIndexOutOfBoundsException

Это единственный способ получить эту ошибку в этой строке.

Другие советы

Ваш код выглядит нормально, но я думаю, вам нужно проверить значения row и col, прежде чем

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

Скорее всего, именно здесь ошибка.

ОБНОВЛЕНИЕ - бинго.его

fillArray(args[0])

вы не передаете никаких параметров в свою программу.

попробуй вместо этого

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

Я бы сделал это скорее так:

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;
    }
}

Вот входной файл, который я использовал:первое значение — # строк, второе — # столбцов, остальные — значения матрицы.

2
3

# first row
1
2
3

# second row
4
5
6

Вот результат, который я получил с помощью простого файла, по одному значению в строке.Я читаю в матрице 2х3:

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

Process finished with exit code 0
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top