-1

我有一个名为 listOfDrills 的列表,其中包含 Iterator DrillIt,这是迭代器没有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

您应该在填写完列表后创建迭代器。如文档中所示:

此类的 iterator 和 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 回答