'是java
的新手。任何人都可以帮我解决错误arrayindexoutofboundsexception
。
public class Minesweeper {
public static void main(String[] args) {
int M = Integer.parseInt(args[0]);
int N = Integer.parseInt(args[1]);
double p = Double.parseDouble(args[2]);
// game grid is [1..M][1..N], border is used to handle boundary cases
boolean[][] bombs = new boolean[M+2][N+2];
for (int i = 1; i <= M; i++)
for (int j = 1; j <= N; j++)
bombs[i][j] = (Math.random() < p);
// print game
for (int i = 1; i <= M; i++) {
for (int j = 1; j <= N; j++)
if (bombs[i][j]) System.out.print("* ");
else System.out.print(". ");
System.out.println();
}
// sol[i][j] = # bombs adjacent to cell (i, j)
int[][] sol = new int[M+2][N+2];
for (int i = 1; i <= M; i++)
for (int j = 1; j <= N; j++)
// (ii, jj) indexes neighboring cells
for (int ii = i - 1; ii <= i + 1; ii++)
for (int jj = j - 1; jj <= j + 1; jj++)
if (bombs[ii][jj]) sol[i][j]++;
// print solution
System.out.println();
for (int i = 1; i <= M; i++) {
for (int j = 1; j <= N; j++)
if (bombs[i][j]) System.out.print("* ");
else System.out.print(sol[i][j] + " ");
System.out.println();
}
}
}
以下是例外:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at Minesweeper.main(Minesweeper.java:5)
答案 0 :(得分:8)
可能有两件事,因为它表示索引0(参见第一个案例):
您没有将参数传递给您的主要课程。
数组索引始终从0开始而不是1.因此您可能需要更改:
您获得ArrayIndexOutOfBoundException的原因是假设您在数组中有2个元素。它将如下:
a[0] = 1;
a[1] = 2;
当你使用i = 1进行循环时;我&lt; = 2你正在访问:
a[1] - which is perfect
a[2] - which was not expected?
答案 1 :(得分:5)
在访问元素之前,您必须检查数组args
的长度。因为您必须访问数组中的第二个元素,所以长度应至少为3.您必须检查如下所示
if(args.length > 2) {
//wrap all code here
}
答案 2 :(得分:3)
你必须检查是否有两个args,代码如下:
if(args.length > 2)
此外,我认为更改这样的行更好:
for (int i = 1; i <= M; i++) {
for (int j = 1; j <= N; j++)
到此:
for (int i = 0; i <M; i++) {
for (int j = 0; j < N; j++)
答案 3 :(得分:3)
(解决方案#1)
您已经使用了如下命令行参数,args [0],args 1和args [3]意味着您的类需要3个参数才能正确运行,但是您没有提供任何参数,< / p>
// int M = Integer.parseInt(args[0]);
// int N = Integer.parseInt(args[1]);
// double p = Double.parseDouble(args[2]);
int M = 2;
int N = 3;
double p = 3.99;
然后您的代码输出将是;
* * *
* * *
* * *
* * *
您的代码需要3个参数,我上面所做的只是使用赋值而不是使用args []数组的值来分配这些参数。
(解决方案#2)
您可以传递3个命令行参数,而不是更改代码,这些参数代表int M,N和double p。要在 eclipse ide;
中执行此操作
现在你不会再次获得“ ArrayIndexOutOfBoundsException ”,值为2 4 0.9,输出将是;
* * . *
* . * *
* * 4 *
* 4 * *
(适用说明)强>
您的代码中存在两个问题;
您有 ArrayIndexOutOfBoundsException 异常,这意味着您的代码会尝试使用超出索引的数组值。
您正在使用命令行参数,但您没有输入任何参数作为参数。您的主要方法需要3个参数才能正确运行但没有参数。 args[0]
,args[1]
和args[2]
表示存在带有args []的数组名称,并且您正尝试访问args []数组的第0个,第1个和第2个元素。但是,如果您不提供命令行参数,那么您将尝试达到空值,从而获得;
线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:0 在com.stack1.Minesweeper.main(Minesweeper.java:8)
为了说清楚,首先我将解释什么是 ArrayIndexOutOfBoundsException ;
当代码中的语句尝试访问索引大于数组长度的数组索引时,会发生ArrayIndexOutOfBoundsException 错误。让我来解释一下;
假设您有2辆车。 第一辆车的颜色为红色,第二辆车的颜色为蓝色。如果我问你“你的第二辆车的颜色是什么”,你会给我答案为蓝色。但是我问的是“你的第五辆车的颜色是什么?”你会说“我没有第五辆车”。
“ ArrayIndexOutOfBoundsException ”错误是相同的,在这种情况下,您只返回“ ArrayIndexOutOfBoundsException ”错误,因为索引5大于您的汽车的最大数量索引,实际上是汽车阵列的长度。
String car[] = new String[2];
car[0] = "blue";
car[1] = "red";
为了说清楚,让我们运行下面的代码;
public class CarColorExample
{
public static void main(String[] args)
{
String[] carArray = new String[2];
carArray[0] = "blue";
carArray[1] = "red";
System.out.println("1st car color value: " + carArray[0]);
System.out.println("2nd car color value: " + carArray[1]);
System.out.println("3rd car color value: " + carArray[2]);
}
}
如果您尝试运行上面的代码,您将获得如下例外情况;
1st car color value: blue
2nd car color value: red
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at com.stack1.CarColorExample.main(CarColorExample.java:15)
声明“java.lang.ArrayIndexOutOfBoundsException:2”实际指向超越索引,告诉你carArray没有第二个索引。
index: 0 --> "blue"
index: 1 --> "red"
index: 2 --> ????
关于 ArrayIndexOutOfBoundsException 错误的第二个例子,请查看下面的代码并运行它;
public static void main(String[] args)
{
int[] intArray = new int[3];
intArray[0] = 25;
intArray[1] = 36;
intArray[2] = 99;
//Will work with no error
for(int i = 0; i < intArray.length; i++)
System.out.println("index[" + i + "], value:" + intArray[i]);
// Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
// at com.stack1.ErrorExample2.main(ErrorExample2.java:18)
//
// "ArrayIndexOutOfBoundsException" error will occur for index: 3
// The length of the array is 2
// index: 0 --> 25
// index: 1 --> 36
// index: 2 --> 99
// There is no third index, That's all
for(int i = 0; i < intArray.length + 1; i++)
System.out.println("index[" + i + "], value:" + intArray[i]);
}
}
同样的问题,索引'3'超出了完全存储在“intArray.length”中的数组的最大索引