Java 幻方给出了ArrayIndexOutOfBoundException
我一直在研究魔方的形成,在阅读了algo之后,我发现在形成魔方的过程中有一些规则需要遵循 下面的算法是: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)
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;
}
}