递归实现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
相关产品推荐
相关产品推荐

