Java-数组索引越界异常
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/22029021/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Java- Array Index Out of Bounds Exception
提问by snoopy
I'm making a simple program where I input 20 integer values from a text file into the 2D array. I obtained the row and column value through the first two values in the text file.
我正在制作一个简单的程序,我将文本文件中的 20 个整数值输入到二维数组中。我通过文本文件中的前两个值获得了行和列值。
From what I understand, the IndexOutOfBoundsException
means that my 2D array (4 rows and 5 columns):
据我了解,这IndexOutOfBoundsException
意味着我的二维数组(4 行 5 列):
- the values are larger than the array size- not possible because there are only 20 values.
- there are not enough values to fill the array- ^ reason
- 这些值大于数组大小 - 不可能,因为只有 20 个值。
- 没有足够的值来填充数组- ^ 原因
What am I missing? Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
我错过了什么? 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 number per line) 4 5 1 3 5 7 12 34 56 78 21 44 36 77 29 87 48 77 25 65 77 2
文本文件:(每行 1 个数字)4 5 1 3 5 7 12 34 56 78 21 44 36 77 29 87 48 77 25 65 77 2
采纳答案by Ted Bigham
I'd be willing to bet you're not passing the name of your data file to your program.
我敢打赌您不会将数据文件的名称传递给您的程序。
if args.length == 0
then args[0]
throws ArrayIndexOutOfBoundsException
如果args.length == 0
然后args[0]
抛出ArrayIndexOutOfBoundsException
That's about the only way you can get that error on that line.
这是您在该行上获得该错误的唯一方法。
回答by Leo
Your code looks fine, but I think you have to check the values of row and col before
您的代码看起来不错,但我认为您必须先检查 row 和 col 的值
int[][] tempArray=new int[row][col];
Most probably, that's where the error is.
最有可能的是,这就是错误所在。
UPDATE - bingo. it's
更新 - 宾果游戏。它是
fillArray(args[0])
you're not passing any parameter to your program.
您没有将任何参数传递给您的程序。
try instead
试试吧
fillArray("c:\path\to\my\file.txt");
回答by duffymo
I'd do it more like this:
我会更像这样:
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;
}
}
Here's the input file I used: first value is # rows, second is # cols, the rest are the matrix values.
这是我使用的输入文件:第一个值是#rows,第二个是#cols,其余的是矩阵值。
2
3
# first row
1
2
3
# second row
4
5
6
Here's the output I got with a simple file, one value per line. I read in a 2x3 matrix:
这是我用一个简单文件得到的输出,每行一个值。我读入了一个 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