对象在数组中丢失

时间:2013-01-18 13:07:19

标签: java arrays

我正在制作一个RPG风格的节目,但我很难让我的宝藏对象阵列工作。我想保存我在阵列中找到的所有宝藏,以便稍后打印出来。以下是宝藏类的代码:

private static int x = 0;
Treasure treasureArray[] = new Treasure[20];

public void collectedTreasures(Treasure t){
treasureArray[x] = t;
x++;
}

在主程序中:

GoldTreasure t = new Coin();
hero1.setPoints(t.getCoin());
t.collectedTreasures(t);

宝藏对象的创建在无限循环内的开关内。 当我用方法

打印出数组时
public void printTreasures(){
        for (int y=0 ; y<x ; y++){
            System.out.print(treasureArray[y] + ", ");

我只得到“null”,因为阵列中应该有许多宝藏。如果我在t.collectedTreasures(t)之后打印出数组,我看到只有最后一个宝藏,并且该对象之前的索引为空。我做错了什么?

是的,我是新手。太好了。

3 个答案:

答案 0 :(得分:6)

这段代码非常可疑:

GoldTreasure t = new Coin();
hero1.setPoints(t.getCoin());
t.collectedTreasures(t);

这意味着你:

  1. 创建新宝藏t;
  2. 在那个实例上调用collectedTreasures
  3. 你应该将宝藏阵列分配给英雄,而不是宝藏本身。

    另请注意,x不应该是静态变量,因为它将在所有实例之间共享;显然不是你的意图,因为宝藏阵列是每个实例。

答案 1 :(得分:0)

问题在于你自己收集了宝藏,因为你召集了属于宝藏的收集功能来收集自己。

稍后,当你在printTreasures中调用它运行的对象时?您是否创建了一个新的宝藏实例并要求它打印收集的内容?如果是这样,结果是根据代码而没有问题,但逻辑是错误的。

你应该做什么:英雄是收集宝藏的人,因此在英雄级中移动宝藏,计数器和2个功能的集合 - 收集的宝藏和印刷品。更进一步,使X不是静态的,因为它的价值将在英雄之间分享。也许,更优雅,创造一个额外的课程来处理宝藏,并使用不同的类别组成你的英雄。

我可以建议对collectTreasures(Treasure t)函数进行renamig以收集Treasure(Treasure t)。

答案 2 :(得分:0)

我们需要看到您的完整代码,以便为您提供详细的答案,但我怀疑您正在做的是创建大量Treasure子类并在每个子类上调用collectedTreasure。这会逐次增加您的全局x计数器,而每个人treasureArray只有一个条目。

您可以将collectedTreasure方法移动到与hero1对象对应的类,同时摆脱静态(全局)x变量并替换您的数组具有Treasure实施的List个对象(例如ArrayList),它们都会跟踪自己的大小,因此您不必这样做。此外,当您获得超过20件宝物时,您的代码不会崩溃!