如何使用更新的null对象启动数组?

时间:2013-02-04 15:40:55

标签: java

我有一个(相当静态的)类,如:

class Test
{
    private Planet gault;
    private Planet irtok;
    private Planet ktaris;

    /* problem:
    private Planet [] planets = {
        this.gault, this.irtok, this.ktaris
    };
    */

    Test() {

    }

    public void doTest() {
        this.gault  = new Planet("Klingon", 1322);
        this.irtok  = new Planet("Ferengi", 1213);
        this.ktaris = new Planet("Ktarian", 16512);
    }
}

我想要的(如果可以的话)是有一个指向每个星球的数组 - 。

private Planet [] planets = {
    this.gault, this.irtok, this.ktaris
};

这样我doTest()可以做类似的事情:

for (Planet p: in planets)
    p.printInfo();

从我尝试的各种方式来看,我总是以p为空;

3 个答案:

答案 0 :(得分:3)

  

从我尝试的各种方式来看,我总是以p为NULL;

这很可能是因为复制后的字段为null

private Planet [] planets = {
   this.gault, this.irtok, this.ktaris
};

我建议制作这些行星final

private final Planet gault  = new Planet("Klingon", 1322);
private final Planet irtok  = new Planet("Ferengi", 1213);
private final Planet ktaris = new Planet("Ktarian", 16512);

使用调试器是一种检查此方法的简单方法。

答案 1 :(得分:3)

默认情况下,您的行星为空。您只能使用doTest()方法初始化它们。但是,在构建Test对象之前很久就会执行初始化行星数组的行。所以此时,所有行星仍为空,因为尚未调用doTest()

阵列应该在行星之后立即初始化。一切都应该在构造函数中完成,而不是在doTest()中完成。

答案 2 :(得分:1)

制作一个引用星球的课程PlanetHolder

public class PlanetHolder {
    Planet p
}

现在将代码更改为以下内容:

class Test {
    private PlanetHolder gault = new PlanetHolder();
    private PlanetHolder irtok = new PlanetHolder();
    private PlanetHolder ktaris = new PlanetHolder();

    private PlanetHolder [] planets = {
        this.gault, this.irtok, this.ktaris
    };

    public void doTest() {
        this.gault.p  = new Planet("Klingon", 1322);
        this.irtok.p  = new Planet("Ferengi", 1213);
        this.ktaris.p = new Planet("Ktarian", 16512);
    }
}

现在你可以遍历行星并打印它们:

for (PlanetHolder p : planets) {
    p.p.printInfo();
}