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

Java 矩阵乘法代码中的数组索引越界异常,java,multidimensional-array,indexoutofboundsexception,Java,Multidimensional Array,Indexoutofboundsexception,它不断将异常数组索引抛出乘法方法的界限之外,但维度是正确的。错误出现在这一行: mm[r][c]+=multiplier[i][j]*multiplicand[j][i]; k.multiply_matrix(temp1,temp2,i1,h,i2); 在这一行: mm[r][c]+=multiplier[i][j]*multiplicand[j][i]; k.multiply_matrix(temp1,temp2,i1,h,i2); 我想知道引发异常的原因,以及为使代码正确运行而可能进

它不断将异常数组索引抛出乘法方法的界限之外,但维度是正确的。错误出现在这一行:

mm[r][c]+=multiplier[i][j]*multiplicand[j][i];
k.multiply_matrix(temp1,temp2,i1,h,i2);
在这一行:

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);
    }
}
导入java.util.array;
导入java.util.List;
导入java.util.Scanner;
公共类矩阵乘法
{
公共静态void main(字符串参数[])
{
matrixmultiplication k=新的matrixmultiplication();
System.out.println(“输入行数和列数”);
扫描仪c=新扫描仪(System.in);
字符串f=c.next();
字符串[]x=f.split(“,”);
inti1=Integer.parseInt(x[0]);
inti2=Integer.parseInt(x[1]);
int[][]temp1=k。输入矩阵(i1,i2);
System.out.println(“第二个矩阵中有多少列”);
int h=c.nextInt();
int[][]temp2=k。输入矩阵(i2,h);
k、 乘法矩阵(temp1,temp2,i1,h,i2);
}
公共整数[]输入矩阵(整数d1,整数d2)
{
扫描仪c1=新扫描仪(系统英寸);
int_矩阵[][]=新int[d1][d2];

对于(int col=0;col而言,问题在于将
i1
i2
传递给方法,
multiply\u matrix
。但是
i1
i2
是行和列的数量。数组从零开始。因此,如果有一个包含两行两列的二维数组,它的最大索引为1。(0和1是数组中的两个位置)因此当您调用该行时:

mm[r][c]+=multiplier[i][j]*multiplicand[j][i];
您将始终具有indexoutofboundsexception,因为(在这个2×2数组的示例中)您将调用不存在的索引(2,2)。您需要将该参数
i1-1
i2-1
传递给该方法

还有一个旁注:我不会让用户在同一行中输入行和列,然后将其拆分。这很容易出错。如果用户输入一个数字、逗号、空格,然后再输入另一个数字,这将导致错误。或者如果用户没有键入逗号,这也将导致错误。最好在两个分隔符上调用
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();

发生错误时,
i
j
r
c
的值是多少?请提供一个。您输入了什么?您应该描述输入。作为一个有根据的猜测,我认为问题在于您正在反转行和列维度。“但维度是正确的”-那么什么是不正确的?不要只是假设,调试。当抛出异常时,用于访问数组的变量的值是什么?这些数组的维度是什么?您看到区别了吗?在您的逻辑中,您试图访问数组边界之外的元素,为什么?教科书中的矩阵乘法器通常是三层楼的事情,内部的目的是什么?