2012-11-30 5 views
0

LogCat 출력의 오류가 QuestionView.java의 37 행을 가리키고 있습니다.이 코드는 아래 코드에 설명 할 것입니다. 아래에는 4 개의 클래스로 구성된 4 개의 스 니펫이 있습니다. 또한 LogCat의 출력이 있습니다.ArrayList OutOfBounds - Java (Android) 프로그래밍

MainMenu.java

public class MainMenu extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mainmenumain); 

    Button button1 = (Button)findViewById(R.id.startBtn); 
    Button button2 = (Button)findViewById(R.id.categoriesBtn); 
    Button button3 = (Button)findViewById(R.id.highscoresBtn); 
    Button button4 = (Button)findViewById(R.id.aboutBtn); 

    button1.setOnClickListener(new OnClickListener() { 
     public void onClick(View arg0) { 
      Intent intent1 = new Intent(MainMenu.this, QuestionView.class); 
      startActivity(intent1); 
     } 
    }); 
//more code... 

Question.java

public class Question { 
String a1; 
String a2; 
String a3; 
String a4; 
int correctAnswer; 
String query; 

public Question() { 
} 

public Question(String a1, String a2, String a3, String a4, int correctAnswer, String query) { 
    this.a1 = a1; 
    this.a2 = a2; 
    this.a3 = a3; 
    this.a4 = a4; 
    this.correctAnswer = correctAnswer; 
    this.query = query;   
} 

public String getA1() { return a1; } 
public String getA2() { return a2; } 
public String getA3() { return a3; } 
public String getA4() { return a4; } 
public String getQuery() { return query; } 
public int getCorrectAnswer() { return correctAnswer; } 
    } 

Quiz.java

public class Quiz { 
ArrayList<Question> qList = new ArrayList<Question>(); 
public static ArrayList<Question> tenQs = new ArrayList<Question>(10); 

public Quiz() { 
    qList.add(new Question("A", "B", "C", "D", 3, "Question 1?")); 
    qList.add(new Question("A", "B", "C", "D", 3, "Question 2?")); 
    qList.add(new Question("A", "B", "C", "D", 3, "Question 3?")); 
    qList.add(new Question("A", "B", "C", "D", 3, "Question 4?")); 
    qList.add(new Question("A", "B", "C", "D", 3, "Question 5?")); 
    qList.add(new Question("A", "B", "C", "D", 3, "Question 6?")); 
    qList.add(new Question("A", "B", "C", "D", 3, "Question 7?")); 
    qList.add(new Question("A", "B", "C", "D", 3, "Question 8?")); 
    qList.add(new Question("A", "B", "C", "D", 3, "Question 9?")); 
    qList.add(new Question("A", "B", "C", "D", 3, "Question 10?")); 
    qList.add(new Question("A", "B", "C", "D", 3, "Question 11?")); 
    qList.add(new Question("A", "B", "C", "D", 3, "Question 12?")); 
    qList.add(new Question("A", "B", "C", "D", 3, "Question 13?")); 
    qList.add(new Question("A", "B", "C", "D", 3, "Question 14?")); 
} 

public void getRandom10() { 
    for(int i = 0; i < 10; i++) { 
     Question x = qList.get((int) Math.floor((qList.size()+1)*Math.random())); 
     if(tenQs.contains(x) == true) { 
      i--; 
     } else { 
      tenQs.add(x); 
     } 
    } 
} 

public ArrayList<Question> getTenQs() { 
    return tenQs; 
} 
    } 

QuestionView.java

public class QuestionView extends Activity { 

Quiz quiz = new Quiz(); 
ArrayList<Question> queries = quiz.getTenQs(); 

int correctAnswers = 0; 
int wrongAnswers = 0; 

int answer = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.questionviewmain); 

    TextView question = (TextView)findViewById(R.id.question); 

    Button answer1 = (Button)findViewById(R.id.answer1); 
    Button answer2 = (Button)findViewById(R.id.answer2); 
    Button answer3 = (Button)findViewById(R.id.answer3); 
    Button answer4 = (Button)findViewById(R.id.answer4); 

    for(int i = 0; i < 10; i++) { 
     question.setText(queries.get(i).getQuery()); //Error points to here. 
     answer1.setText(queries.get(i).getA1()); 
     answer2.setText(queries.get(i).getA2()); 
     answer3.setText(queries.get(i).getA3()); 
     answer4.setText(queries.get(i).getA4()); 

     answer = queries.get(i).getCorrectAnswer(); 

     answer1.setOnClickListener(new OnClickListener() { 
      public void onClick(View arg0) { 
       if(answer == 0) { 
        correctAnswers++; 
       } else { 
        wrongAnswers++; 
       } 
      } 
     }); 
//more code... 
,174,

는 어떤 도움이나 입력이 감사

11-12 00:08:40.983: E/AndroidRuntime(4338): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.QuestionView}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at android.app.ActivityThread.access$600(ActivityThread.java:130) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at android.os.Looper.loop(Looper.java:137) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at java.lang.reflect.Method.invoke(Method.java:511) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at dalvik.system.NativeStart.main(Native Method) 
11-12 00:08:40.983: E/AndroidRuntime(4338): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at java.util.ArrayList.get(ArrayList.java:304) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at com.example.test.QuestionView.onCreate(QuestionView.java:37) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at android.app.Activity.performCreate(Activity.java:5008) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
11-12 00:08:40.983: E/AndroidRuntime(4338):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
를 로그 캣! 미리 감사드립니다.

+0

그 예외입니다. 제대로 초기화되고 null 값이 아닌 Array 항목 값을 참조하고 있는지 확인하십시오. –

답변

0

getRandom10() 메서드를 호출하여 목록을 초기화하지 마십시오.

편집
는 또한 클래스 Quiz과 나쁜 디자인을 사용 :

  1. tenQs

    당신이 non-static 목록 qList에서 데이터 채우기 static 목록입니다. Quiz.tenQs :

  2. tenQs 클래스를 통해 직접 액세스 할 수있는 가능성을 제공 public입니다. 나는 privatenon-static으로 만들고 의 올바른 초기화를 위해 constateror 내에서 getRandom10을 호출한다고 가정합니다.

코드 :

  • 는로 임의 인덱스를 얻을

    Random r = new Random(); 
    for(int i = 0; i < 10; i++) { 
        Question x = qList.get(r.nextInt(qList.size())); 
        tenQs.add(x); 
    } 
    

    나는 이해했다. 내부에 for 조건 < tenQs.size()을 사용하는 경우이 for은 실행되지 않습니다. 실제 크기는 tenQs이며 0이지만 용량은 10입니다. 따라서 퀴즈에서 질문의 수와 함께 상수를 만들고이 for 루프에 사용해야합니다.

  • +0

    발견.I는 getTenQs 결합() 및 한 하나의 방법으로 getRandomTen() 공개 ArrayList를 getRandom10()에 대한 { \t INT (I = 0; i가 tenQs.size() "; 나는 ++)을 { \t \t 질문 X = qList.get (int) Math.floor ((qList.size() + 1) * Math.random())); \t \t 경우 (참 tenQs.contains (X) ==) { \t \t \t 난 -; \t \t} else { \t \t \t tenQs.add (x); \t \t} \t} \t return tenQs; } 아직 작동하지 않지만 적어도 오류없이 실행됩니다. – Matt

    +0

    또한 왜 tenQs가 정적인지 확실하지 않습니다. 나는 전에 얼마 동안 손을 흔들고 있었고, 그것을 다시 잊어 버린 것을 잊지 않았다. 방금 비 정적으로 변경했습니다. – Matt

    +0

    imran이 언급 한 것처럼'onCreate' 안에'for (int i = 0; i bellum

    1
    는 루프 조건에 대한 귀하의 변경

    :

    for(int i = 0; i < queries.size() ; i++) 
    

    하고 사용하기 전에 queries ArrayList에 초기화되어 있는지 확인이

    0

    qList.size() + 1 = 11 0 사이의 숫자를 줄 것이다 그래서 무작위 10까지 ... 숫자가 0에서 9까지라면 괜찮습니다. 그러나 10은 프로그램이 실패하게 만듭니다.