矩阵乘法代码中的数组索引超出范围异常

时间:2018-05-27 12:52:06

标签: java multidimensional-array indexoutofboundsexception

它不断抛出异常数组索引超出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);
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

你将始终有一个indexoutofboundsexception,因为(在这个2乘2数组的例子中)你将调用不存在的索引(2,2)。您需要将参数i1-1i2-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();