我在处理程序调用中遇到问题。问题如下:
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]);
}
每次显示错误,表示我已超出数组范围。这意味着处理程序调用在循环结束后执行,因此我已经超过了它的限制。我怎样才能以适当的方式做出类似的事情?
修改:
抱歉我之前的错误。代码的第一行是:
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]);
}
答案 0 :(得分: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]);
}
答案 1 :(得分:0)
您在2个不同的上下文中使用索引变量i
。
在代码中,在使用i
作为数组索引的循环之前执行此操作:
IUpdateHandler mm[i] = new ........// you know what
然后在循环中,您正在更改i
的值并引用mm[i]
和sprite[i]
。
我假设您没有正确地将mm
数组初始化为正确的大小(spriteArrayLength
)
答案 2 :(得分:0)
问题是您的更新处理程序包含对变量i
的引用,但直到循环结束后才会对其进行求值。不要保留对i
的引用,而是给它一个特定sprite的引用,为了便于阅读,使它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]);
}