变量可能尚未在二维数组中初始化

时间:2019-04-15 07:57:49

标签: java

我有一个static matrixMult和static matrixAdd方法以及一个static matrixDisplay(用于打印结果),我在Main函数中编写了一个测试示例。

我的目标:我想用这两种静态方法将两个矩阵相乘并相加。

我收到这些错误“变量C和d可能尚未初始化”。 有人可以告诉我,这是什么问题?

public class Matrixmultadd {

    static double[][] matrixMult(double[][] A,double[][] B) {
        double[][] C; //declar this variable for return the result
        //return null if on of matrix are null
        if(A == null || B == null){
            return null;
        }


        if(A[1].length == B.length){ //check to be equal columns of A with rows of B
            for(int n = 0;n < A.length;n++){//n is numbers of rows of A
                for(int k = 0;k < B[n].length;k++){
                    C[n][k] = 0.0;
                     for(int l = 0;l < A[n].length;l++){//row n of A multiple in column k of B
                        C[n][k] += A[n][l] * B[l][k];

                    }
                }

            }
        return C;
        } else {
        return null;
        }

    }


    static double[][] matrixAdd(double[][] a,double[][] b) {

    //check the rows and columns of a and b are equal
        if(a.length == b.length && a[1].length == b[1].length){
            double[][] d; //declar this variable for return the result
            for(int n = 0;n < b.length;n++){
                for(int m = 0;m < b[1].length;m++){
                    d[n][m] = a[n][m] + b[n][m];
                }
            }
            return d;
        }else {
            return null;
        }

    } 


    static void matrixDisplay(double[][] a){

        for(int i = 0; i < a.length;i++){
            for(int k = 0;k < a[1].length;k++){
                System.out.print(a[i][k] + "\t");
            }
        System.out.println();
        }

    }

public static void main(String[] args){
    double[][] A = {{1,2,3},{4,5,6}}; 

    double[][] B= {{1,2},{3,4},{5,6}};

    double[][] d;
    d = matrixMult(A,B);
    matrixDisplay(d);
}

}

5 个答案:

答案 0 :(得分:1)

您必须初始化这些变量。在您的情况下,它将类似于:

  

对于C-double [] [] C =新double [A.length] [B.length];

     

对于d double [] [] d =新double [a.length] [b.length];

    static double[][] matrixMult(double[][] A,double[][] B) {
        double[][] C = new double[A.length][B.length]; //declar this variable for return the result
        //return null if on of matrix are null
        if(A == null || B == null){
            return null;
        }


        if(A[1].length == B.length){ //check to be equal columns of A with rows of B
            for(int n = 0;n < A.length;n++){//n is numbers of rows of A
                for(int k = 0;k < B[n].length;k++){
                    C[n][k] = 0.0;
                     for(int l = 0;l < A[n].length;l++){//row n of A multiple in column k of B
                        C[n][k] += A[n][l] * B[l][k];

                    }
                }

            }
        return C;
        } else {
        return null;
        }

    }


    static double[][] matrixAdd(double[][] a,double[][] b) {

    double[][] d = new double[a.length][b.length]; //declar this variable for return the result
    //check the rows and columns of a and b are equal
        if(a.length == b.length && a[1].length == b[1].length){
            for(int n = 0;n < b.length;n++){
                for(int m = 0;m < b[1].length;m++){
                    d[n][m] = a[n][m] + b[n][m];
                }
            }
            return d;
        }else {
            return null;
        }

    } 


    static void matrixDisplay(double[][] a){

        for(int i = 0; i < a.length;i++){
            for(int k = 0;k < a[1].length;k++){
                System.out.print(a[i][k] + "\t");
            }
        System.out.println();
        }

    }

public static void main(String[] args){
    double[][] A = {{1,2,3},{4,5,6}}; 

    double[][] B= {{1,2},{3,4},{5,6}};

    double[][] d;
    d = matrixMult(A,B);
    matrixDisplay(d);
}

}

答案 1 :(得分:1)

在使用变量C和d之前,应先对其进行初始化,因为Java将数组视为对象,并且它们已在堆内存中分配。

double[][] C = new double[A.length][B[1].length]

double[][] d = new double[a.length][b[1].length]

答案 2 :(得分:0)

由于您的javascript:document.getElementsByClassName('ant-radio-input')[1].checked = true:方法中有条件语句,因此有可能永远不会满足该条件。因此,您的声明

matrixMult

可能永远不会初始化,这将导致

错误
 double[][] C;

因此您可以通过对其进行初始化来修复它,例如

return C;

此外,您在if语句中缺少 double[][] C = new double[length][length]; // your actual dimensions 数组的分配语句。您不能将值分配给未初始化的数组。

答案 3 :(得分:0)

您尚未初始化数组变量的维,因此编译器将不知道需要分配数组的大小。

double [] [] C =新double [A.length] [B [0] .length]; double [] [] d =新double [b.length] [b [0] .length];

在代码中的许多地方,您还使用了基于1的索引来测量2D数组中的列数,这可能会导致违反内存访问(OutofBound Exception)

这是修改后的程序。

public class Matrixmultadd {

static double[][] matrixMult(double[][] A,double[][] B) {
    double[][] C=new double[A.length][B[0].length]; //declar this variable for return the result
    //return null if on of matrix are null
    if(A == null || B == null){
        return null;
    }


    if(A[0].length == B.length){ //check to be equal columns of A with rows of B
        for(int n = 0;n < A.length;n++){//n is numbers of rows of A
            for(int k = 0;k < B[0].length;k++){
                C[n][k] = 0.0;
                 for(int l = 0;l < A[0].length;l++){//row n of A multiple in column k of B
                    C[n][k] += A[n][l] * B[l][k];

                }
            }

        }
    return C;
    } else {
    return null;
    }

}


static double[][] matrixAdd(double[][] a,double[][] b) {

//check the rows and columns of a and b are equal
    if(a.length == b.length && a[0].length == b[0].length){
        int row=b.length;
        int col=b[0].length;
        double[][] d=new double[row][col]; //declar this variable for return the result            
        for(int n = 0;n <row;n++){
            for(int m = 0;m <col;m++){
                d[n][m] = a[n][m] + b[n][m];
            }
        }
        return d;
    }else {
        return null;
    }

} 


static void matrixDisplay(double[][] a){
    int row=a.length;
    int col=a[0].length;
    for(int i = 0; i < row;i++){
        for(int k = 0;k < col;k++){
            System.out.print(a[i][k] + "\t");
        }
    System.out.println();
    }

}

public static void main(String [] args){     double [] [] A = {{1,2,3},{4,5,6}};

double[][] B= {{1,2},{3,4},{5,6}};

double[][] d;
d = matrixMult(A,B);
matrixDisplay(d);

}

}

答案 4 :(得分:0)

我不知道您使用Java多久了。在Java中,使用数组,您必须

1. create a block of memory for it and assign it to a reference
double[][] matrix; // now, matrix == null
matrix = new double[10][10]; // now matrix is the address of the memory
2. initialize it 
matrix[0][3]=0
3. access it
System.out.println(matrix[0][3])

在您的情况下,在上面的第一步中声明了C和d,而没有为其分配任何内存块并保留为null,这意味着在初始化或访问它时,您将触发null指针异常

double[][] C; //declar this variable for return the result return null if on of matrix are null
double[][] d; //declar this variable for return the result

在这种情况下,请添加以下内容进行修复。

double[][] C = new double[A.length][B[1].length]
double[][] d = new double[b.length][b[1].length]

Java数组用法,这可能是一个很好的例子 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html