Java-Array-Index-Ausnahme außerhalb der Grenzen
-
21-12-2019 - |
Frage
Ich erstelle ein einfaches Programm, in dem ich 20 Ganzzahlwerte aus einer Textdatei in das 2D-Array eingebe.Ich habe den Zeilen- und Spaltenwert über die ersten beiden Werte in der Textdatei erhalten.
Soweit ich weiß, ist das IndexOutOfBoundsException
bedeutet, dass mein 2D-Array (4 Zeilen und 5 Spalten):
- Die Werte sind größer als die Arraygröße- nicht möglich, da nur 20 Werte vorhanden sind.
- Es gibt nicht genügend Werte, um den Array-Grund zu füllen
Was vermisse ich? 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();
}
}
}
Textdatei: (1 Zahl pro Zeile) 4 5 1 3 5 7 12 34 56 78 21 44 36 77 29 87 48 77 25 65 77 2
Lösung
Ich würde wetten, dass Sie den Namen Ihrer Datendatei nicht an Ihr Programm weitergeben.
Wenn args.length == 0
Dann args[0]
wirft ArrayIndexOutOfBoundsException
Das ist ungefähr die einzige Möglichkeit, diesen Fehler in dieser Zeile zu erhalten.
Andere Tipps
Ihr Code sieht gut aus, aber ich denke, Sie müssen vorher die Werte von Zeile und Spalte überprüfen
int[][] tempArray=new int[row][col];
Höchstwahrscheinlich liegt dort der Fehler.
UPDATE - Bingo.es ist
fillArray(args[0])
Sie übergeben keine Parameter an Ihr Programm.
Versuchen Sie es stattdessen
fillArray("c:\\path\\to\\my\\file.txt");
Ich würde es eher so machen:
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;
}
}
Hier ist die Eingabedatei, die ich verwendet habe:Der erste Wert besteht aus # Zeilen, der zweite aus # Spalten, der Rest sind die Matrixwerte.
2
3
# first row
1
2
3
# second row
4
5
6
Hier ist die Ausgabe, die ich mit einer einfachen Datei erhalten habe, ein Wert pro Zeile.Ich habe in einer 2x3-Matrix gelesen:
[ 0, 0]: 1
[ 0, 1]: 2
[ 0, 2]: 3
[ 1, 0]: 4
[ 1, 1]: 5
[ 1, 2]: 6
Process finished with exit code 0