如何修复java.lang.arrayindexoutofboundsexception:0?

时间:2014-10-28 06:35:29

标签: java

'是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) 

4 个答案:

答案 0 :(得分:8)

可能有两件事,因为它表示索引0(参见第一个案例):

  1. 您没有将参数传递给您的主要课程。

  2. 数组索引始终从0开始而不是1.因此您可能需要更改:

    • 你的循环从0开始并检查i&lt; M或N
    • 您使用数组索引作为i - 1而不是i。
  3. 您获得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;

中执行此操作
  1. 右键点击您的课程,然后选择以 - &gt;运行运行配置;
  2. enter image description here

    1. 选择参数选项卡并编写三个参数,在它们之间留出空格;
    2. enter image description here

      现在你不会再次获得“ ArrayIndexOutOfBoundsException ”,值为2 4 0.9,输出将是;

      * * . * 
      * . * * 
      
      * * 4 * 
      * 4 * * 
      

      (适用说明)

      您的代码中存在两个问题;

      1. 您有 ArrayIndexOutOfBoundsException 异常,这意味着您的代码会尝试使用超出索引的数组值。

      2. 您正在使用命令行参数,但您没有输入任何参数作为参数。您的主要方法需要3个参数才能正确运行但没有参数。 args[0]args[1]args[2]表示存在带有args []的数组名称,并且您正尝试访问args []数组的第0个,第1个和第2个元素。但是,如果您不提供命令行参数,那么您将尝试达到空值,从而获得;

        线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:0     在com.stack1.Minesweeper.main(Minesweeper.java:8)

      3. 为了说清楚,首先我将解释什么是 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”中的数组的最大索引