我正在制作一个简单的动态壁纸应用程序。
我创建了一个新类来轻松创建和存储一些变量。我初始化了类,当我尝试运行它的方法时,它返回null。
有人可以检查我的代码并告诉我出了什么问题吗?
public int hH;
public int wW;
public Liinijas l;
@Override
public void onSurfaceChanged(SurfaceHolder holder,
l=new Liinijas(100,hH,wW); /// initializing my object
}
// Now Drawing method that uses my object
void draw() {
if (l != null) {
Log.i("happened?","if happened, isnt null?");
l.step(tx, ty); // this is what I thought, called null pointer exception
drawLines(l,c,paint); // main class method that works with variables from Liinijas class. what actually calls exception by trying to access null variables in l
}
}
这是Liinijas
类,我认为问题在于我如何尝试初始化这些数组:
public class Liinijas {
public Point[] p,p2;
public int lielums;
Liinijas(int size,int x,int y) {
p = new Point[size];
p2 = new Point[size];
this.lielums = size;
}
public void step(int x, int y) {
}
}
解决: 这里的问题不是该对象本身是null,而是其变量为null。初学者容易忽视。 这解决了这个问题:
public class Liinijas {
public Point[] p,p2;
public int lielums;
Liinijas(int size,int x,int y){
p = new Point[size];
p2 = new Point[size];
for (int i=0;i<size;i++){ ///relevant new code
p[i] = new Point();
p2[i] = new Point();
}
///irrelevant code follows
}
public void step(int x, int y){
}
}
注意“丑陋”的方式我通过for循环声明数组中的每个对象。 如果有人发现自己处于同样不太可能的情况,我会留下这个:)
答案 0 :(得分:2)
Liinijas l;
已在方法onSurfaceChanged
中初始化,但已在draw
中使用。可能在onSurfaceChanged
draw
答案 1 :(得分:1)
所以,基本上,错误可以用以下两行重现:
public Liinijas l;
if(l != null){};
看看你在这做什么?声明了变量l
,但除非使用某个值进行初始化,否则无法对其进行任何操作。您需要初始化它(例如,使用空对象或null
)。