我在Java中处理内存时遇到了一些麻烦
import java.util.Scanner;
class P4 {
public static void main(String[] args) {
Matrix x=new Matrix(2,4);
Matrix y=new Matrix(2,4);
Matrix a=new Matrix(2,4);
Matrix b=new Matrix(2,4);
Matrix c=new Matrix(2,4);
x=a.input();
y=b.input();
c=x.add(y);
c.display();
}
}
class Matrix{
private int x,y;
double m[][];
Scanner in=new Scanner(System.in);
Matrix(int a1,int b1){
x=a1;
y=b1;
}
public Matrix input() {
double m[][]=new double[x][y];
System.out.println("Enter "+x*y+" elements : ");
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
m[i][j]=in.nextDouble();
}
}
System.out.println("You Entered : ");
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
System.out.printf("%f\t",m[i][j]);
}
System.out.println();
}
return this;
}
public void display() {
System.out.println("Elements in the Matrix are : ");
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
System.out.printf("%f\t",m[i][j]);
}
System.out.println();
}
}
public Matrix add(Matrix n) {
Matrix temp=new Matrix(n.x,n.y);
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
temp.m[i][j]=m[i][j]+n.m[i][j];
}
}
return temp;
}
public Matrix sub(Matrix n) {
Matrix temp=new Matrix(n.x,n.y);
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
temp.m[i][j]=m[i][j]-n.m[i][j];
}
}
return temp;
}
}
在上面的代码中,我无法将x和y保存在内存中(试图通过使用虚拟a和b来保持它们的参考),因此我无法调用add()导致错误。
BTW,我的输出:
Enter 8 elements :
1 2 3 4 5 6 7 8
You Entered :
1.000000 2.000000 3.000000 4.000000
5.000000 6.000000 7.000000 8.000000
Enter 8 elements :
8 7 6 5 4 3 2 1
You Entered :
Exception in thread "main" 8.000000 7.000000 6.000000 5.000000
4.000000 3.000000 2.000000 1.000000
java.lang.NullPointerException
at Matrix.add(P4.java:53)
at P4.main(P4.java:11)
答案 0 :(得分:1)
在方法input()
中,您声明:
double m[][]=new double[x][y];
这会隐藏实例变量m
,其默认值为null
。稍后,当您稍后尝试访问m
的元素时,您将获得NPE。只需将该行更改为:
m[][]=new double[x][y];
此外,在您的add
和sub
方法中,您尝试访问temp.m
而未初始化它。这也会产生一个NPE,应该改变。
我认为最好的办法是改变你的构造函数:
Matrix(int a1,int b1){
x=a1;
y=b1;
m = new int[a1][b1];
}
并消除input()
中的初始化。没有理由推迟m
的初始化。
答案 1 :(得分:0)
在输入() - 矩阵的方法中,你声明一个新数组,试试这个:
public Matrix input() {
//m = new double[x][y]; // do not instantiate a new m[][] here
在构造函数中,添加instatiation
Matrix(int a1, int b1) {
x = a1;
y = b1;
m = new double[a1][b1];
}