Java中3x2与2x3矩阵乘法报ArrayIndexOutOfBoundsException如何解决?
矩阵乘法代码抛出ArrayIndexOutOfBoundsException的问题分析
核心问题:行与列的定义完全混淆,导致索引越界
你的代码里对矩阵行、列的定义完全搞反了,这是引发异常的根本原因:
- 对于二维数组
int[][] matrix,matrix.length代表矩阵的行数,matrix[0].length代表矩阵每行的列数。 - 原代码中错误地将
r1(矩阵a的行数)赋值为a[0].length,c1(矩阵a的列数)赋值为a.length,完全颠倒了行和列的含义。
直接触发异常的原因
以测试用例为例:
- 矩阵
a是2行3列(a.length=2,a[0].length=3),原代码算出来r1=3、c1=2。 - 外层循环
for (int i = 0; i < r1; i++)会让i遍历到2,此时访问a[i][k]时,a的行数只有2,索引最大为1,直接触发ArrayIndexOutOfBoundsException。
额外问题:结果矩阵维度错误
矩阵乘法规则是:m×n的矩阵 × n×p的矩阵 = m×p的矩阵。原代码创建的结果矩阵维度是r1×c2,因为r1定义错误,导致结果矩阵维度完全不符合预期。
修正后的代码
import java.util.Arrays; public class MultiplyMatrix { public static int[][] multiply(int[][] a, int[][] b) { // 正确定义矩阵的行、列数 int rowsA = a.length, colsA = a[0].length; int rowsB = b.length, colsB = b[0].length; // 先校验矩阵乘法的合法性:A的列数必须等于B的行数 if (colsA != rowsB) { throw new IllegalArgumentException("矩阵乘法不合法:第一个矩阵的列数必须等于第二个矩阵的行数"); } // 结果矩阵维度为 rowsA × colsB int[][] result = new int[rowsA][colsB]; for (int i = 0; i < rowsA; i++) { for (int j = 0; j < colsB; j++) { for (int k = 0; k < colsA; k++) { result[i][j] += a[i][k] * b[k][j]; } } } return result; } public static void main(String[] args) { System.out.println("Test your code here!\n"); int[][] a = { {1, 2, 3}, {4, 5, 6} }; int[][] b = { {7, 8}, {9, 10}, {11, 12} }; int[][] result = multiply(a, b); System.out.println(Arrays.deepToString(result).replace("]","]\n")); } }
修正说明
- 纠正了行、列的定义逻辑,确保变量含义与实际矩阵维度匹配。
- 添加了合法性校验,提前拦截不符合乘法规则的输入,避免后续错误。
- 修正了结果矩阵的维度,符合矩阵乘法的数学规则。
- 循环变量的范围随之修正,不会再出现索引越界的情况。
内容的提问来源于stack exchange,提问作者Yuliia Herasymova
相关产品推荐
相关产品推荐

