Java 变量可能未在二维数组中初始化
我有一个静态矩阵结果和静态矩阵添加方法以及一个静态矩阵显示(用于打印结果),我在主函数中编写了一个测试示例 我的目标是:我想用这两种静态方法乘和加两个矩阵 我得到这些错误“变量C和d可能尚未初始化”。 有人能告诉我,有什么问题吗Java 变量可能未在二维数组中初始化,java,Java,我有一个静态矩阵结果和静态矩阵添加方法以及一个静态矩阵显示(用于打印结果),我在主函数中编写了一个测试示例 我的目标是:我想用这两种静态方法乘和加两个矩阵 我得到这些错误“变量C和d可能尚未初始化”。 有人能告诉我,有什么问题吗 public class Matrixmultadd { static double[][] matrixMult(double[][] A,double[][] B) { double[][] C; //declar this variabl
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);
}
}
公共类Matrixmultadd{
静态双[]矩阵结果(双[]A,双[]B){
double[]]C;//取消此变量以返回结果
//如果矩阵的on为null,则返回null
如果(A==null | | B==null){
返回null;
}
如果(A[1].length==B.length){//检查A的列与B的行是否相等
对于(int n=0;n
由于在矩阵结果
方法中有条件语句,因此可能永远不会满足条件。那么你的声明呢
double[][] C;
可能永远不会初始化,这将导致
return C;
因此,您可以通过初始化来修复它,例如
double[][] C = new double[length][length]; // your actual dimensions
此外,if语句中缺少
C
数组的分配语句。无法为未初始化的数组赋值。必须初始化这些变量。在您的情况下,它将类似于:
对于C-双精度[][]C=新双精度[A.长度][B.长度]
对于d双精度[][]d=新双精度[a.length][b.length]
static double[][]矩阵结果(double[]]A,double[]]B){
double[]C=new double[A.length][B.length];//清除此变量以返回结果
//如果矩阵的on为null,则返回null
如果(A==null | | B==null){
返回null;
}
如果(A[1].length==B.length){//检查A的列与B的行是否相等
对于(int n=0;n
在使用变量C和d之前,您应该初始化它们,因为Java将数组视为对象,它们在堆内存中分配
double[]C=新的双精度[A.length][B[1]。length]
double[]d=新的double[a.length][b[1]。length]
您尚未初始化数组变量的维度,因此编译器将不知道需要分配的数组大小
double[]C=新的双精度[A.length][B[0]。length];
double[]d=新的双精度[b.length][b[0].length]
此外,在代码中的许多地方,您使用了基于1的索引来测量2D数组中的列数,这可能会导致内存访问冲突(OutofBound异常)
这是修改后的程序
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();
}
}
}
}我不知道您使用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数组的使用,这可能是一个很好的例子
在if块之后返回C,但如果语句的计算结果从未为true,则不会为trueisntantiated@ScaryWombat实际上,
C
从未被初始化(实例化),无论A
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]