Java: excepción del índice de matriz fuera de límites
-
21-12-2019 - |
Pregunta
Estoy creando un programa simple en el que ingreso 20 valores enteros de un archivo de texto en una matriz 2D.Obtuve el valor de la fila y la columna a través de los dos primeros valores en el archivo de texto.
Por lo que tengo entendido, el IndexOutOfBoundsException
significa que mi matriz 2D (4 filas y 5 columnas):
- Los valores son mayores que el tamaño de la matriz, no es posible porque solo hay 20 valores.
- No hay suficientes valores para llenar la matriz- ^
¿Qué me estoy perdiendo? 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();
}
}
}
TEXTILLO: (1 número por línea) 4 5 1 3 5 7 12 34 56 78 21 44 36 77 29 87 48 77 25 65 77 2
Solución
Estaría dispuesto a apostar que no está pasando el nombre de su archivo de datos a su programa.
si args.length == 0
entonces args[0]
lanza ArrayIndexOutOfBoundsException
Esa es la única manera de obtener ese error en esa línea.
Otros consejos
Su código se ve bien, pero creo que tiene que verificar los valores de la fila y el col antes de
int[][] tempArray=new int[row][col];
Probablemente, ahí es donde está el error.
actualización - bingo.es
fillArray(args[0])
No está pasando ningún parámetro a su programa.
intente en lugar
fillArray("c:\\path\\to\\my\\file.txt");
Lo haría más así:
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;
}
}
Aquí está el archivo de entrada que utilizo: el primer valor es # filas, el segundo es # cols, el resto son los valores de la matriz.
2
3
# first row
1
2
3
# second row
4
5
6
Aquí está la salida que tengo con un archivo simple, un valor por línea.Leí en una 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