Pergunta

Estou fazendo um programa simples onde insiro 20 valores inteiros de um arquivo de texto no array 2D.Obtive o valor da linha e da coluna por meio dos dois primeiros valores do arquivo de texto.

Pelo que entendi, o IndexOutOfBoundsException significa que meu array 2D (4 linhas e 5 colunas):

  1. Os valores são maiores que o tamanho da matriz- não é possível porque existem apenas 20 valores.
  2. Não há valores suficientes para preencher a matriz

o que estou perdendo? 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 número por linha) 4 5 1 3 5 7 12 34 56 78 21 44 36 77 29 87 48 77 25 65 77 2

Foi útil?

Solução

Aposto que você não está passando o nome do seu arquivo de dados para o seu programa.

se args.length == 0 então args[0] lança ArrayIndexOutOfBoundsException

Essa é a única maneira de obter esse erro nessa linha.

Outras dicas

Seu código parece bom, mas acho que você precisa verificar os valores de linha e coluna antes

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

Muito provavelmente é aí que está o erro.

ATUALIZAÇÃO - bingo.isso é

fillArray(args[0])

você não está passando nenhum parâmetro para o seu programa.

tente em vez disso

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

Eu faria mais assim:

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

Aqui está o arquivo de entrada que usei:o primeiro valor é # linhas, o segundo é # colunas, o restante são os valores da matriz.

2
3

# first row
1
2
3

# second row
4
5
6

Aqui está a saída que obtive com um arquivo simples, um valor por linha.Eu li em uma matriz 2x3:

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

Process finished with exit code 0
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top