1

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

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();

从我尝试过的各种方式来看,我总是以pNULL 告终;

4

3 回答 3

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);

使用调试器是检查这一点的简单方法。

于 2013-02-04T15:43:40.837 回答
3

您的行星默认为空。doTest()您只需在方法中初始化它们。但是初始化行星数组的行很久以前就执行过:在构造测试对象时。所以此时,所有的行星仍然是空的,因为doTest()还没有被调用。

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

于 2013-02-04T15:45:03.563 回答
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();
}
于 2013-02-04T15:46:08.367 回答