Исключение Java-индекса массива за пределами границ
-
21-12-2019 - |
Вопрос
Я создаю простую программу, в которой ввожу 20 целочисленных значений из текстового файла в двумерный массив.Я получил значение строки и столбца через первые два значения в текстовом файле.
Насколько я понимаю, IndexOutOfBoundsException
означает, что мой 2D-массив (4 строки и 5 столбцов):
- Значения больше размера массива- невозможно, потому что существует только 20 значений.
- Недостаточно значений, чтобы заполнить разум
Что мне не хватает? 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