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

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"));
    }
}

修正说明

  1. 纠正了行、列的定义逻辑,确保变量含义与实际矩阵维度匹配。
  2. 添加了合法性校验,提前拦截不符合乘法规则的输入,避免后续错误。
  3. 修正了结果矩阵的维度,符合矩阵乘法的数学规则。
  4. 循环变量的范围随之修正,不会再出现索引越界的情况。

内容的提问来源于stack exchange,提问作者Yuliia Herasymova

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:52:36