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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:13:01