これは私の最初のスタックオーバーフローポストであり、私はかなりjava
に新しくなっているので、私は最初にあなたが私に与えるフィードバックの一部を理解していないかもしれません。ArrayIndexOutOfBoundsException 2次元配列/行列の行列式を見つけるときに
このプログラムでは、ユーザーが決定したサイズで行列の行列式を再帰的に見つけることになっています。私はそうすると、しかし、私はこのエラーを取得:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at Determinant.Copy<Determinant.java:55>
at Determinant.det<Determinant.java:31>
at Determinant.main<Determinant.java:15>
私は、このエラーが何を意味するかを理解し、それが起こっている理由を私は理解していません。ここで
は、私が使用しているクラスである(printmatrixとmainメソッドの両方が先生によって書かれた、私はコピーとDETのメソッドを完了する必要がありました):エラーがelseステートメント内で発生import javax.swing.JOptionPane;
public class Determinant
{
public static void main(String args[])
{
String sizeStr = JOptionPane.showInputDialog("What size?");
int size = Integer.parseInt(sizeStr);
int[][] matrix = new int[size][size];
for(int i=0; i<size; i++)
for(int j=0; j<size; j++)
matrix[i][j] = (int)(Math.random()*40)-20;
printArray(matrix);
System.out.println("\nThe determinant = "+det(matrix));
}
public static int det(int[][] A)
{
int answer = 0;
int place = 0;
int[][] temp;
int[][] temp1;
if(A.length==1){
return(A[0][0]);
}
for(int i = 0; i<A.length; i++){
temp = new int[A.length-1][A[0].length-1];
temp1 = Copy(temp, i);
if(i%2==0){
place = 1;
}
else{
place = -1;
}
answer = answer + place * A[0][i] * det(temp1);
}
return answer;
}
public static int[][] Copy(int[][] B, int i)
{
int[][] C = new int[B.length-1][B.length-1];
for(int j = 1; j<B.length; j++){
for(int k = 0; k<B[0].length; k++){
if(k>i){
C[j-1][k-1]=B[j][k];
}
else{
C[j-1][k]=B[j][k];
}
}
}
return C;
}
public static void printArray(int[][] A)
{
for(int i=0; i<A.length; i++)
{
for(int j=0; j<A.length; j++)
{
int num = A[i][j];
if(num<-9)
System.out.print(" ");
else if(num<0||num>9)
System.out.print(" ");
else
System.out.print(" ");
System.out.print(A[i][j]);
}
System.out.println();
}
}
}
コピーし、temp1 = Copy(temp, i)
。
jかk = 1のように混乱していますが、配列の位置ではないはずですか?私は何が欠けていますか?
http://stackoverflow.com/questions/5554734/what-causes-a-java-lang-arrayindexoutofboundsexception-and-how-do-i-prevent-it – Tunaki
最初の行のコピーでは、新しい配列を1つの要素にしました(単に唯一の問題ではない) –
2次元配列 'B'をコピーしようとしていると思いますが、' C'の境界線を等価的に設定すると、 'line [int [] [] C = new int [B.length-1] [B.length-1]; 'int [] [] C = new int [B.length] [B [0] .length];' –