You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:53:13