矩阵乘法代码中数组索引越界异常

Array index out of bounds exception in matrix multiplication code

它一直抛出异常数组索引超出 multiply 方法的范围,但维度是正确的。错误出现在这一行:

mm[r][c]+=multiplier[i][j]*multiplicand[j][i];

并在这一行:

k.multiply_matrix(temp1,temp2,i1,h,i2);

我想知道为什么会抛出异常,以及我的代码是否可以修改为 运行 正确。

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class matrixmultiplication
{
    public static void main(String args[])
    {
        matrixmultiplication k=new matrixmultiplication();
        System.out.println("enter how many rows and how many columns");
        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.enter_thematrix(i1,i2);
        System.out.println("how many columns in the second matrix");
        int h=c.nextInt();
        int[][] temp2=k.enter_thematrix(i2,h);
        k.multiply_matrix(temp1,temp2,i1,h,i2);
    }

    public int[][] enter_thematrix(int d1,int d2)
    {
        Scanner c1=new Scanner(System.in);
        int the_matrix[][]=new int[d1][d2];

        for (int col=0;col<d2;col++)
        {
            for(int row=0;row<d1;row++)
            {
                the_matrix[row][col]=c1.nextInt();
            }
        }
        return the_matrix;
    }

    public void print_matrix(int [][]mm,int a,int s)
    {
        for (int col=0;col<s;col++)
        {
            for(int row=0;row<a;row++)
            {
                System.out.print(mm[a][s]+"\t");
            }
            System.out.println();
        }
    }

    public void multiply_matrix(int [][]multiplier,int [][]multiplicand,int r,int c,int innerd)
    {
        int [][]mm=new int[r][c];

        for(int c1=0;c1<c;c1++)
        {
            for(int r1=0;r1<r;r1++)
            {
                for(int i=0;i<innerd;i++)
                {
                    for(int j=0;j<innerd;j++)
                    {
                        mm[r][c]+=multiplier[i][j]*multiplicand[j][i];
                    }
                }
            }
        }

        print_matrix(mm,r,c);
    }
}

问题是您将 i1i2 传递给方法 multiply_matrix。但是 i1i2 是行数和列数。数组从零开始。因此,如果您有一个包含两行和两列的二维数组,它的最大索引将为 1。(0 和 1 是数组中的两个位置)因此,当您调用该行时:

mm[r][c]+=multiplier[i][j]*multiplicand[j][i];

您将始终遇到 indexoutofboundsexception,因为(在这个 2 x 2 数组的示例中)您将调用不存在的索引 (2,2)。您需要将参数 i1-1i2-1 传递给该方法。

另请注意,我不会让用户在同一行输入行和列,然后将其拆分。这是容易出错的。如果用户输入一个数字、逗号、space,然后输入另一个数字,这将导致错误。或者,如果用户没有键入逗号,这也会导致错误。最好分两行调用 nextInt。像这样:

System.out.println("enter how many rows: ");
Scanner c=new Scanner(System.in);
int i1 = c.nextInt();
System.out.println("Enter how many columns: ");
int i2 = c.nextInt();