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

递归实现Java矩阵赋值时出现ArrayIndexOutOfBoundsException的问题排查求助

解决递归矩阵赋值的数组越界问题

我来帮你梳理下代码里的问题,主要是递归的起始参数、终止条件和递归逻辑都有错误,才导致了ArrayIndexOutOfBoundsException,咱们一步步来改:

1. 先修复main方法里的语法错误

你在main方法内部声明了static变量,这是Java语法不允许的——static变量必须放在类的级别(方法外面),所以把三个数组变量移到类里:

import java.util.Scanner;
public class DSPro {
    static Scanner scan = new Scanner(System.in);
    // 将static变量移到类级别
    static double matrix1[][];
    static double matrix2[][];
    static double result[][];

    public static void main(String[] args) {
        System.out.println("What would be the number of n?");
        int number = Integer.parseInt(scan.nextLine());
        matrix1 = new double [number][number];
        matrix2 = new double [number][number];
        result = new double [number][number];
        // 修正起始参数,原因后面说明
        initialize(matrix1, number-1, number-1);
        // 可以调用打印方法测试结果
        printMatrix(matrix1, number-1, number-1);
    }
    // 后续方法放在这里
}

2. 核心:修复递归初始化的逻辑错误

你原来的递归调用是initialize(matrix1, number, number),但数组的索引是从0到number-1的,直接用number作为索引肯定会越界,这是第一个触发异常的点。

再看递归的终止条件和分支逻辑:

  • 终止条件if(i == -1&&j==-1) return ;不合理,只要i < 0就说明所有行都处理完了,应该直接返回,不需要等j也到-1。
  • 当j == -1时,你重置j为matrix[0].length(也就是number),这又会导致访问matrix[i-1][number]再次越界,应该重置为matrix[0].length - 1(也就是number-1)。

修正后的initialize方法:

public static void initialize(double [][] matrix,int i,int j) {
    // 终止条件:i小于0,说明所有行都处理完毕
    if(i < 0) return ;
    // 给当前位置赋值
    matrix[i][j] = Double.parseDouble(scan.nextLine());
    if(j > 0) {
        // 同一行,j往左移动一位
        initialize(matrix, i, j-1);
    } else {
        // j已经到行首,切换到上一行的最后一列
        initialize(matrix, i-1, matrix[0].length - 1);
    }
}

3. 补充递归打印矩阵的实现

按照你的需求,这里加一个递归打印的方法,逻辑和初始化对应,保证打印顺序是从上到下、从左到右:

public static void printMatrix(double[][] matrix, int i, int j) {
    if(i < 0) return;
    // 先递归处理当前行的前一个元素
    if(j > 0) {
        printMatrix(matrix, i, j-1);
    } else {
        // 到行首时换行,再处理上一行
        System.out.println();
        printMatrix(matrix, i-1, matrix[0].length - 1);
    }
    // 打印当前元素,保证顺序正确
    System.out.print(matrix[i][j] + " ");
}

为什么之前的修改会失效?

你尝试把number加1再传参,本质上只是扩大了数组,但递归逻辑的核心错误没解决,还是会在某个时刻访问到超出数组的索引,所以依然会抛出异常。只有把递归的起始索引、终止条件和分支逻辑都修正,才能彻底解决问题。

内容的提问来源于stack exchange,提问作者adabella asi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:17:33