Java 幻方给出了ArrayIndexOutOfBoundException

Java 幻方给出了ArrayIndexOutOfBoundException,java,exception-handling,magic-square,Java,Exception Handling,Magic Square,我一直在研究魔方的形成,在阅读了algo之后,我发现在形成魔方的过程中有一些规则需要遵循 下面的算法是: 魔法常数总是等于n(n^2+1)/2,其中n是给定的维数 magicSquare包含的数字将始终等于1到n*n 对于第一个元素1,将始终处于位置(n/2,n-1) 其他元素将像(i--,j++)一样放置 放置元件的条件为: 这很奇怪。我已经检查过了,感觉使用代码来获得期望的结果是安全的,但我不知道哪里出了问题 代码 static void generateMagicSquare(int n)

我一直在研究魔方的形成,在阅读了algo之后,我发现在形成魔方的过程中有一些规则需要遵循

下面的算法是:

  • 魔法常数总是等于n(n^2+1)/2,其中n是给定的维数
  • magicSquare包含的数字将始终等于1到n*n
  • 对于第一个元素1,将始终处于位置(n/2,n-1)
  • 其他元素将像(i--,j++)一样放置
  • 放置元件的条件为:

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

    代码

    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();
        }
    }
    

    仍然不是正确的答案

    此行抛出错误:

    if(magicSquare[i][j] != 0)
    
    问题是数组
    magicSquare
    被初始化为:

    int[][] magicSquare = new int[n][n];
    
    这意味着它有
    n
    列,其索引从
    0
    n-1
    (索引以零为基础)
    变量
    j
    初始化为

    j = n-1;
    
    然后这一行:

    j++;
    
    使
    j
    等于
    n


    因此,当您访问
    magicSquare[i][j]
    时,您试图访问的
    magicSquare[i][n]

    是不存在的。

    数组的索引是一个整数值,其值在区间[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;
            }
        }
    

    for(int num=2;num从头开始:您知道错误消息的含义吗?我假设您使用某种IDE(NetBeans?Eclipse?IntelliJ?)编写。这里面有调试工具。看看如何使用这些工具,它在解决诸如您这里的问题方面会有很大的不同。不,我在在线Java编译器上编写代码。我现在正在编写代码。明白@Stultuske对我说的话了。@Stultuske我已经添加了编辑,请看。谢谢您的输入,但是您的代码输出了t magicSquare
    的值不正确。正如您提到的ArrayIndexOutOfBoundsException,我只是解决了这个问题。对于magicSquare,您必须正确编码!!我已经编辑了代码,但不知怎的,我得到的值是0。请检查我的
    编辑
    。现在,我的代码中没有异常。
    int[][] magicSquare = new int[n][n];
    
    j = n-1;
    
    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;
            }
        }