对象未在Java中初始化

时间:2014-01-21 02:37:22

标签: java android arrays null adt

我正在制作一个简单的动态壁纸应用程序。

我创建了一个新类来轻松创建和存储一些变量。我初始化了类,当我尝试运行它的方法时,它返回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循环声明数组中的每个对象。 如果有人发现自己处于同样不太可能的情况,我会留下这个:)

2 个答案:

答案 0 :(得分:2)

Liinijas l;已在方法onSurfaceChanged中初始化,但已在draw中使用。可能在onSurfaceChanged

之前未调用draw

答案 1 :(得分:1)

所以,基本上,错误可以用以下两行重现:

public Liinijas l;
if(l != null){};

看看你在这做什么?声明了变量l,但除非使用某个值进行初始化,否则无法对其进行任何操作。您需要初始化它(例如,使用空对象或null)。