Java矩阵乘法代码Array index out of bounds exception问题排查与修正
数组越界异常的原因分析与修复方案
嘿,我帮你排查出了代码里的几个关键问题,正是这些问题导致了数组越界异常,咱们一步步来理清楚:
第一个异常点:mm[r][c]+=multiplier[i][j]*multiplicand[j][i];
这里有两个致命错误:
- 索引用错了:
r和c是你传给multiply_matrix的方法参数(代表结果矩阵的总行数和总列数),但数组的索引是从0开始的,比如结果矩阵是3行2列的话,mm[3][2]直接就超出了数组的最大索引(2和1),不报错才怪。你应该用循环里的r1和c1来访问当前元素,也就是mm[r1][c1]。 - 矩阵乘法逻辑完全错误:矩阵乘法根本不需要四层循环!正确的逻辑是:结果矩阵的第
r1行第c1列元素,等于第一个矩阵的第r1行和第二个矩阵的第c1列对应位置的元素相乘后累加,只需要三层循环就够了,你写的四层循环完全是多余的,还搞混了索引关系。
第二个异常点:k.multiply_matrix(temp1,temp2,i1,h,i2);
这个调用本身的参数是没问题的,之所以抛出异常,是因为multiply_matrix方法内部的逻辑错误触发了上面的索引越界,根源还是方法内部的问题。
还有一个隐藏的错误:print_matrix方法
你在打印矩阵的时候写了System.out.print(mm[a][s]+"\t");,这里的a和s同样是矩阵的总行数和总列数,不是当前循环的索引,也会导致越界,应该改成mm[row][col]。
修复后的完整代码
import java.util.Scanner; public class MatrixMultiplication { // 调整类名符合Java规范 public static void main(String args[]) { MatrixMultiplication k = new MatrixMultiplication(); System.out.println("Enter number of rows and columns for first matrix (format: row,col)"); Scanner c = new Scanner(System.in); String f = c.next(); String[] x = f.split(","); int i1 = Integer.parseInt(x[0]); int i2 = Integer.parseInt(x[1]); int[][] temp1 = k.enterTheMatrix(i1, i2); // 调整方法名符合小驼峰规范 System.out.println("Enter number of columns for the second matrix"); int h = c.nextInt(); int[][] temp2 = k.enterTheMatrix(i2, h); k.multiplyMatrix(temp1, temp2, i1, h, i2); // 调整方法名规范 } // 调整循环顺序为按行输入,符合常规使用习惯 public int[][] enterTheMatrix(int rows, int cols) { Scanner c1 = new Scanner(System.in); int[][] theMatrix = new int[rows][cols]; System.out.println("Enter " + rows + " rows, each with " + cols + " numbers:"); for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { theMatrix[row][col] = c1.nextInt(); } } return theMatrix; } // 修复打印逻辑的索引问题 public void printMatrix(int[][] mm, int rows, int cols) { System.out.println("Result matrix:"); for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { System.out.print(mm[row][col] + "\t"); } System.out.println(); } } // 修复矩阵乘法的核心逻辑与索引问题 public void multiplyMatrix(int[][] multiplier, int[][] multiplicand, int resultRows, int resultCols, int innerDim) { int[][] mm = new int[resultRows][resultCols]; // 遍历结果矩阵的每一行 for (int r1 = 0; r1 < resultRows; r1++) { // 遍历结果矩阵的每一列 for (int c1 = 0; c1 < resultCols; c1++) { // 累加计算当前元素的值 for (int i = 0; i < innerDim; i++) { mm[r1][c1] += multiplier[r1][i] * multiplicand[i][c1]; } } } printMatrix(mm, resultRows, resultCols); } }
额外说明
我还顺便调整了代码的命名规范(类名首字母大写、方法名小驼峰),让代码更易读,同时修改了enterTheMatrix的循环顺序,现在用户可以按行输入矩阵元素,更符合常规的输入习惯。
内容的提问来源于stack exchange,提问作者johnny english
相关产品推荐
相关产品推荐

