-1

イテレータdrillItを含むlistOfDrillsというリストがありますが、イテレータにnext()値がない理由がいくつかあります(リストは正常に機能するため、空ではありませんlistOfDrills.get(0))。コードは次のとおりです。

package com.simplemathgame;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class GamePlayActivity extends Activity {
    int addDrills;
    int subDrills;
    int mulDrills;
    int divDrills;
    int minBound;
    int maxBound;

    TextView drillTextPlace;
    Button nextButton;
    Button backButton;

    List<Drill> listOfDrills = new ArrayList<Drill>();
    Iterator<Drill> drillIt = listOfDrills.iterator();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game_play);

        //get values from other activity
        Bundle extras = getIntent().getExtras();
        addDrills = extras.getInt("addDrills");
        subDrills = extras.getInt("subDrils");
        mulDrills = extras.getInt("mulDrills");
        divDrills = extras.getInt("divDrills");
        minBound = extras.getInt("minBound");
        maxBound = extras.getInt("maxBound");

        for(int i = 0; i < addDrills; i++){
            AddDrill tmpDrill = new AddDrill(minBound,maxBound);
            listOfDrills.add(tmpDrill);
        }

        for(int i = 0; i < subDrills; i++){
            SubDrill tmpDrill = new SubDrill(minBound,maxBound);
            listOfDrills.add(tmpDrill);
        }

        for(int i = 0; i < mulDrills; i++){
            MulDrill tmpDrill = new MulDrill(minBound,maxBound);
            listOfDrills.add(tmpDrill);
        }

        for(int i = 0; i < divDrills; i++){
            DivDrill tmpDrill = new DivDrill(minBound,maxBound);
            listOfDrills.add(tmpDrill);
        }

        long seed = System.nanoTime();
        Collections.shuffle(listOfDrills, new Random(seed));

        drillTextPlace = (TextView) findViewById(R.id.drill_text);
        nextButton = (Button) findViewById(R.id.next_button);
        backButton = (Button) findViewById(R.id.back_button);

        if(drillIt.hasNext()){
            drillTextPlace.setText((drillIt.next()).printDrill());
        }

        nextButton.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(drillIt.hasNext()){
                    drillTextPlace.setText(drillIt.next().printDrill());
                }
            }
        });
    }

}

コードは決して入力されません:

if(drillIt.hasNext()){
            drillTextPlace.setText((drillIt.next()).printDrill());
        }

ifステートメント を削除してそのままにしておくとdrillTextPlace.setText((drillIt.next()).printDrill()); 、アプリがクラッシュします。

なぜこれが起こっているのですか?私は何を間違えましたか?ありがとう!!!

4

2 に答える 2

5

リストに入力したら、イテレータを作成する必要があります。ドキュメントに見られるように:

このクラスのイテレータメソッドとlistIteratorメソッドによって返されるイテレータはフェイルファストです。イテレータの作成後にリストが構造的に変更された場合、イテレータ自体のremoveまたはaddメソッド以外の方法で、イテレータはConcurrentModificationExceptionをスローします。

http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

動く

Iterator<Drill> drillIt = listOfDrills.iterator();

直前に:

if (drillIt.hasNext()) {
    drillTextPlace.setText((drillIt.next()).printDrill());
}
于 2012-12-22T22:47:14.710 に答える
0

イテレータの作成が早すぎます。使用する直前に作成する必要があります。空のときに作成します。次に電話をかけるたびにそれがうまくいったとしても、あなたは前進し、決して後退することはありません...

于 2012-12-22T22:48:58.857 に答える