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" を final にしてみました。さらに、クラス フィールドとして宣言してグローバルにしました。多くのコードが含まれているため、ここでは短いコード例を記述しようとしています。より良いバージョンは次のとおりです。

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