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

デフォルトでは、あなたの惑星は null です。doTest()メソッドでそれらを初期化するだけです。しかし、惑星の配列を初期化する行はずっと前に実行されます: Test オブジェクトが構築されるときです。したがって、この時点では、doTest()まだ呼び出されていないため、すべての惑星はまだ null です。

配列は、惑星の直後に初期化する必要があります。そしておそらく、すべては ではなくコンストラクターで実行する必要がありdoTest()ます。

于 2013-02-04T15:45:03.563 に答える
1

PlanetHolderPlanet を参照するクラスを作成します。

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 に答える