Java幻方代码抛出ArrayIndexOutOfBoundsException,求错误原因
排查幻方Java代码中的ArrayIndexOutOfBoundsException错误
你的代码抛出ArrayIndexOutOfBoundsException的核心原因是数组初始化错误,同时还有多处边界处理和循环逻辑问题,以下是逐一排查和修正方案:
1. 致命错误:数组初始化完全错误
原代码中:
int i = 0; int j = n / 2; int[][] magicSquare = new int[i][j];
这里i初始值为0,导致创建的二维数组行数为0,完全无法容纳n×n的幻方数据。当你尝试访问magicSquare[i][j]时,数组根本没有行,自然触发索引越界。
修正:幻方是n阶的,需要创建n行n列的数组:
int[][] magicSquare = new int[n][n];
2. 边界处理逻辑错误
原代码的越界处理完全不符合幻方的生成规则:
- 当
j < 0时,原代码执行j = j - 1;会让列索引变得更小,正确的逻辑应该是循环到最右列,即j = n - 1; - 原有的
i < 0 && j < 0分支逻辑错误,正确的幻方生成规则是:如果计算出的位置越界且已被填充,则回到上一个位置的下方,而不是错误的重置值。
修正后的边界处理逻辑:
if (i < 0 && j < 0) { i += 2; j += 1; } else { if (i < 0) { i = n - 1; // 行越上边界,回到最后一行 } if (j < 0) { j = n - 1; // 列越左边界,回到最后一列 } }
3. 打印循环的索引越界
原代码打印幻方时使用了<=作为循环终止条件:
for (i = 0; i <= magicSquare.length; i++) { for (j = 0; j <= magicSquare[i].length; j++) {
数组索引从0开始,magicSquare.length是行数,最大行索引是length-1,所以应该用<作为终止条件:
for (i = 0; i < magicSquare.length; i++) { for (j = 0; j < magicSquare[i].length; j++) {
修正后的完整代码
import java.util.*; public class MagicSquare { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("Enter a number: "); int n = sc.nextInt(); // 仅支持奇数阶幻方,添加输入判断 if (n % 2 == 0) { System.out.println("请输入奇数来生成幻方"); return; } int i = 0; int j = n / 2; int[][] magicSquare = new int[n][n]; // 修正数组初始化 for (int num = 1; num <= n * n;) { // 修正边界处理逻辑 if (i < 0 && j < 0) { i += 2; j += 1; } else { if (i < 0) { i = n - 1; } if (j < 0) { j = n - 1; } } // 处理已填充的位置 if (magicSquare[i][j] != 0) { i += 2; j -= 1; continue; } magicSquare[i][j] = num; num++; // 移动到上一行左一列 i--; j--; } // 修正打印循环 for (i = 0; i < magicSquare.length; i++) { for (j = 0; j < magicSquare[i].length; j++) { System.out.print(magicSquare[i][j] + " "); } System.out.println(); } } }
补充说明
这段代码仅支持奇数阶幻方,所以添加了输入判断,如果输入偶数会提示错误。运行输入3时,会输出正确的3阶幻方:
Enter a number: 3 8 1 6 3 5 7 4 9 2
内容的提问来源于stack exchange,提问作者Tranquillitatis
相关产品推荐
相关产品推荐

