魔术广场给出ArrayIndexOutOfBoundException

时间:2019-01-29 11:08:10

标签: java exception-handling magic-square

我一直在研究魔术广场的形成,在通读算法之后,我发现在形成魔术广场时要遵循某些规则。

我关注的算法是:

  
      
  1. 魔术常数将始终等于n(n ^ 2 +1)/ 2,其中n是给定的维数。
  2.   
  3. magicSquare组成的数字将始终等于1到n * n。
  4.   
  5. 对于第一个元素1,将始终位于(n / 2,n-1)位置。
  6.   
  7. 其他元素将放置为(i-,j ++)
  8.   
  9. 放置元素要满足的条件是:

         
    a) If i < 0, then i = n-1.
    b) If j == n, then j = 0.
    c) This is a special case, if i < 0 and j=n happens at the same time, then i = 0, j = n-2.
    d) If the position is already occupied by some other element, then i++, j = j-2.
    
      
  10.   
  11. 然后根据条件在magicSquare中输入元素。

  12.   

基于上述算法,我写下了代码,由于某种原因,我得到了

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3                                                                  
        at Main.generateMagicSquare(Main.java:25)                                                                                       
        at Main.main(Main.java:58) 

这很奇怪。我已经检查过了,觉得使用代码来获得期望的结果是安全的,但是我不知道我要去哪里。

代码

static void generateMagicSquare(int n){
    int[][] magicSquare = new int[n][n];

    //initialising for pos of the elem 1
    int i = n/2, j = n-1;
    magicSquare[i][j] = 1;

    //the element consist by the magic square will always be equal to 1 to n*n
    for(int num=2; num <= n*n; num++){
        //it must go like this, for any other element
        i--; j++;

        // if the element is already present
        if(magicSquare[i][j] != 0){
            i++;
            j -= 2; 
        }else{
            if(i < 0)
                i = n-1;

            if(j == n)
                j = 0;

            if(i < 0 && j == n){
                i = 0;
                j = n-2;
            }
        }

        magicSquare[i][j] = num;
    }

    for(int k=0; k<n; k++){
        for(int l=0; l<n; l++){
            System.out.print(magicSquare[k][l] + " ");
        }

        System.out.println();
    }
}

任何帮助将不胜感激。谢谢。既然我可以从Internet复制并粘贴代码,但是我想以自己的方式学习它,而您的帮助将帮助我实现我想要的。 :)

编辑

在阅读完异常之后,我在代码中做了一些修改,但是仍然有些结果没有达到标准。

这是我更新的代码========

static void generateMagicSquare(int n){
int[][] magicSquare = new int[n][n];

//initialising for pos of the elem 1
int i = n/2, j = n-1;
magicSquare[i][j] = 1;

//the element consist by the magic square will always be equal to 1 to n*n
for(int num=2; num <= n*n; num++){
    //it must go like this, for any other element
    i--; j++;

    if(i < 0){
       i = n-1;
    }

    if(j == n){
       j = 0;
    }

    if(i < 0 && j == n){
       i = 0;
       j = n-2;
    }

    if(magicSquare[i][j] != 0){
       i++;
       j -= 2;
    }else{
       magicSquare[i][j] = num;
    }
}

for(int k=0; k<n; k++){
    for(int l=0; l<n; l++){
        System.out.print(magicSquare[k][l] + " ");
    }

    System.out.println();
}
}

我得到以下输出:

2 0 6                                                                                                                                   
9 5 1                                                                                                                                   
7 3 0 

仍然不是正确的答案。

2 个答案:

答案 0 :(得分:1)

此行引发错误:

if(magicSquare[i][j] != 0)

问题是数组magicSquare初始化为:

int[][] magicSquare = new int[n][n];

表示它有n,其索引从0n - 1(索引从零开始)。
变量j初始化为

j = n-1;

以及随后的这一行:

j++;

使j等于n
因此,当您访问magicSquare[i][j]时,您正在尝试访问magicSquare[i][n]
不存在。

答案 1 :(得分:0)

数组的索引是一个整数值,其值在间隔[0,n-1]中,其中n是数组的大小。如果请求一个负数或索引大于或等于数组的大小,则JAVA会引发ArrayIndexOutOfBounds异常。在数组中使用i和j之前,必须检查它的值。您可以使用以下代码:

for(int num=2; num <= n*n; num++){
        i--; j++;
        //Here We have to check the value of i and j i.e. it should less than or equal to the length of array.
        if((i <= magicSquare[0].length-1 && j <= magicSquare[0].length-1))
        {
            if(magicSquare[i][j] != 0){
                i++;
                j -= 2; 
            }else{
                if(i < 0)
                    i = n-1;
                if(j == n)
                    j = 0;
                if(i < 0 && j == n){
                    i = 0;
                    j = n-2;
                }
            }
            magicSquare[i][j] = num;
        }
    }

要了解ArrayIndexOutOfBoundsException,请访问:

https://www.geeksforgeeks.org/understanding-array-indexoutofbounds-exception-in-java/