Java矩阵乘法代码触发Index Out of Bounds Exception的问题排查
矩阵乘法代码抛出ArrayIndexOutOfBoundsException的问题分析
这种只在非对称矩阵相乘时触发的数组越界异常,核心原因是矩阵维度处理逻辑出错,常见的问题点有以下几个:
1. 结果矩阵维度初始化错误
矩阵乘法的规则是:若A是m×n矩阵,B是n×p矩阵,结果矩阵必须是m×p维度。如果错误地将结果矩阵初始化为其他维度(比如跟着B的行数或A的列数走),后续赋值或输出时必然会触发越界。
比如计算1×3矩阵乘3×1矩阵时,结果应该是1×1矩阵,若代码里错误地把结果矩阵初始化为new int[3][1],后续即使计算逻辑没问题,输出时也可能因为遍历范围错误触发异常。
2. 循环边界取值错误
不管是计算过程还是结果输出,循环的边界必须严格对应结果矩阵的维度,而非原矩阵的维度。比如:
- 计算时,遍历结果矩阵的行应该用
result.length(即A的行数),列应该用result[0].length(即B的列数) - 如果错误地把列的循环边界设为A的列数(比如3),而结果矩阵的列数实际是1,当循环到j=1时,
result[i][j]就会抛出「索引1超出长度1」的异常——这完全匹配你遇到的报错场景。
3. 输出结果时的维度混淆
很多人写完乘法逻辑后,输出矩阵时偷懒直接复用原矩阵的维度循环。比如遍历结果矩阵时,列数用了A的列数而非结果矩阵的列数:
// 错误的输出代码示例 for (int i = 0; i < result.length; i++) { // 这里错误使用了a[0].length,而非result[i].length for (int j = 0; j < a[0].length; j++) { System.out.print(result[i][j] + " "); } }
当结果矩阵是1×1,而A的列数是3时,j循环到1就会访问result[0][1],直接触发越界。
修正后的参考代码
下面是正确的矩阵乘法实现,包含合法性校验和维度处理逻辑:
public static int[][] multiplyMatrices(int[][] a, int[][] b) { // 先校验矩阵是否可相乘:a的列数必须等于b的行数 if (a[0].length != b.length) { throw new IllegalArgumentException("矩阵无法相乘:a的列数与b的行数不匹配"); } int rowsA = a.length; int colsA = a[0].length; int colsB = b[0].length; // 结果矩阵维度严格遵循m×p规则 int[][] result = new int[rowsA][colsB]; for (int i = 0; i < rowsA; i++) { for (int j = 0; j < colsB; j++) { int sum = 0; for (int k = 0; k < colsA; k++) { sum += a[i][k] * b[k][j]; } result[i][j] = sum; } } return result; } // 正确的矩阵输出方法 public static void printMatrix(int[][] matrix) { for (int[] row : matrix) { for (int num : row) { System.out.print(num + " "); } System.out.println(); } }
排查建议
- 先检查结果矩阵的初始化代码,确认是
new int[a.length][b[0].length] - 核对所有循环的边界条件,确保行和列的循环范围对应结果矩阵的维度
- 输出结果时,严格遍历结果矩阵自身的行和列长度
内容的提问来源于stack exchange,提问作者Nimesh
相关产品推荐
相关产品推荐

