2012-12-22 2 views
-1

iterator에 next() 값이없는 이유가 무엇입니까? listOfDrills라는 목록이 있습니다. 왜 iterator는 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()); 응용 프로그램 충돌을 둡니다.

왜 이런 일이 발생하고 있습니까? 나는 무엇을 잘못 했는가? 감사!!!

+1

어떤 오류 메시지가 나옵니까? 전체 스택 추적을 표시하십시오. –

답변

5

목록을 채운 후에 반복기를 만들어야합니다. 문서에서 볼 수 있듯이 :

은이 클래스의 반복자에 의해 반환 된 반복자 및 listIterator의 방법이 있습니다 르파 : 반복자의 작성 후에리스트는 구조적 이외 방법으로 시간이 변경되면 반복자 자체의 메소드 제거 또는 추가로 반복자는 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()); 
} 
0

, 그것을 작성해야합니다. 비어있을 때 생성 중입니다. 그것이 당신이 다음에 전화 할 때마다 일하더라도, 앞으로 나아갈 것이고 결코 뒤로 물러 설 수 없을 것입니다 ...

관련 문제