1

我在处理程序调用中工作时遇到问题。问题如下:

Sprite sprite = new Sprite[spriteArrayLength];
IUpdateHandler mm[i] = new ........// you know what
for(int i = 0; i < spriteArrayLength; i++){
   //many other actions
   mm[i] = new IUpdateHandler() {

       //do somthing with sprite array items
       float anyVar = sprite[i].getX();//problem rises here
   };
   sprite[i].registerUpdateHandler(mm[i]);
}

每次它显示一个错误,说我超出了数组范围。这意味着处理程序调用在 for 循环结束后执行,因此我已经超过了它的限制。我怎样才能以适当的方式做上面的事情?

编辑:

对不起我之前的错误。代码的第一行将是:

Sprite sprite[] = new Sprite[spriteArrayLength];
IUpdateHandler mm[] = new ........// you know what

不是这个:

Sprite sprite = new Sprite[spriteArrayLength];
IUpdateHandler mm[i] = new ........// you know what

我只是认为这些行不是很重要,这就是为什么犯了错误。但问题仍然存在。

编辑2:

我得到“数组越界”类型的运行时错误。假设数组大小是 6。所以,最后一个元素是 5。但是在 UpdateHandler 内部“i”以 6 开头并引发错误。我尝试使“i”成为最终的,甚至通过声明为类字段使其成为全局。我正在尝试在这里编写简短的代码示例,因为它包含许多代码。更好的版本如下:

public int i;//global declaration
//inside some method:
Sprite sprite[] = new Sprite[spriteArrayLength];
IUpdateHandler mm[] = new IUpdateHandler[spriteArrayLength];
for(i = 0; i < spriteArrayLength; i++){
    //many other actions
    mm[i] = new IUpdateHandler() {

       //do somthing with sprite array items
       float anyVar = sprite[i].getX();//problem rises here
    };
    sprite[i].registerUpdateHandler(mm[i]);
}
4

3 回答 3

1

根据您的 Edit-2 中的代码,我的建议是:

Sprite sprite[] = new Sprite[spriteArrayLength];
IUpdateHandler mm[] = new IUpdateHandler[spriteArrayLength];
for(i = 0; i < spriteArrayLength; i++){
    //many other actions
    mm[i] = new IUpdateHandler() {

       private final int id = i; /* add this line */
       // call Log.i() here is compiling error

       @Override
       public void onUpdate(float pSecondElapsed) {
           //do somthing with sprite array items
           /* And access id, instead of i in below code. 
              Here, I assume this statement is located 
              within onUpdate() or reset().
            */
           float anyVar = sprite[id].getX();
       }

       @Override
       public void reset() {
       }
    };
    sprite[i].registerUpdateHandler(mm[i]);
}
于 2013-06-08T10:57:27.960 回答
0

问题是您的更新处理程序持有对变量的引用,i但直到循环完成后才被评估。不要持有对 的引用i,而是给它一个对特定精灵的引用,并且为了便于阅读,final请避免任何怀疑它可能会改变:

for(i = 0; i < spriteArrayLength; i++){
    final Sprite currentSprite = sprite[i];

    //many other actions
    mm[i] = new IUpdateHandler() {
        //do somthing with sprite array items
        float anyVar = currentSprite.getX();
    };
    currentSprite.registerUpdateHandler(mm[i]);
}
于 2013-06-08T14:36:36.623 回答
0

i在 2 个不同的上下文中使用索引变量。

在您的代码中,您在循环之前使用i数组索引执行此操作:

IUpdateHandler mm[i] = new ........// you know what

然后在循环内,您正在更改i和引用的值mm[i]sprite[i]

我假设您没有正确地将mm数组初始化为正确的大小 ( spriteArrayLength)

于 2013-06-07T14:56:43.627 回答