它不断抛出异常数组索引超出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);
}
}
答案 0 :(得分:0)
问题是您将i1
和i2
传递给方法multiply_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();