2014-02-17 21 views
0

當我嘗試加載另一個活動時,我不斷收到ArrayIndexOutOfBoundsException。所以,當我到達我的代碼時,它只是失敗。這裏是有問題的代碼:Android數據模型的問題

package com.example.lasic; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class QuestionActivity extends Activity{ 
    private int counter = 0; 
    private UserScanner scanner; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.firstq); 
     scanner = new UserScanner(); 
     loadNext(); 
    } 
    public void loadNext() { 
     Button button1 = (Button) findViewById(R.id.button1); 
     button1.setText(scanner.left.get(counter)); 
     TextView view1 = (TextView) findViewById(R.id.textView1); 
     view1.setText(scanner.questionList.get(counter)); 
     Button button2 = (Button) findViewById(R.id.button2); 
     button2.setText(scanner.centerLeft.get(counter)); 
     Button button3 = (Button) findViewById(R.id.button3); 
     button3.setText(scanner.center.get(counter)); 
     Button button4 = (Button) findViewById(R.id.button4); 
     button4.setText(scanner.centerRight.get(counter)); 
     Button button5 = (Button) findViewById(R.id.button5); 
     button5.setText(scanner.right.get(counter)); 
     counter = counter + 1; 
    } 
} 

我已經測試了UserScanner類,它的工作原理與我打算的一樣。它包含五個數組列表中的數據(左,中,中左,右,中心右),我知道它們正確填充,因爲我希望它們是。然而,當我運行Android程序時,我收到以下錯誤logcat中

02-17 14:28:20.307: E/AndroidRuntime(1245): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 
02-17 14:28:20.307: E/AndroidRuntime(1245):  at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
02-17 14:28:20.307: E/AndroidRuntime(1245):  at java.util.ArrayList.get(ArrayList.java:308) 
02-17 14:28:20.307: E/AndroidRuntime(1245):  at com.example.lasic.QuestionActivity.loadNext(QuestionActivity.java:21) 
02-17 14:28:20.307: E/AndroidRuntime(1245):  at com.example.lasic.QuestionActivity.onCreate(QuestionActivity.java:17) 
02-17 14:28:20.307: E/AndroidRuntime(1245):  at android.app.Activity.performCreate(Activity.java:5133) 
02-17 14:28:20.307: E/AndroidRuntime(1245):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
02-17 14:28:20.307: E/AndroidRuntime(1245):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
02-17 14:28:20.307: E/AndroidRuntime(1245):  ... 11 more 



package com.example.lasic; 

import java.util.ArrayList; 
import java.util.Scanner; 

import android.os.Parcelable; 

public class UserScanner { 
    private ArrayList<String> strings; 
    private ArrayList<String> questionList; 
    private ArrayList<String> left; 
    private ArrayList<String> centerLeft; 
    private ArrayList<String> center; 
    private ArrayList<String> right; 
    private ArrayList<String> centerRight; 
    public UserScanner(){ 
     this.strings = InsertionSort.laser(); 
     this.questionList = new ArrayList<String>(20); 
     this.left = new ArrayList<String>(20); 
     this.centerLeft = new ArrayList<String>(20); 
     this.center = new ArrayList<String>(20); 
     this.centerRight = new ArrayList<String>(20); 
     this.right = new ArrayList<String>(20); 
     for(String x: strings) { 
      if (x.contains("M:")) { 
     center.add(x); 
     } 
      else if (x.contains("CL:")) { 
     centerLeft.add(x); 
     } 
      else if (x.contains("CR:")) { 
     centerRight.add(x); 
     } 
      else if (x.contains("L:")) { 
       left.add(x); 
     } 
     else if (x.contains("R:")) { 
     right.add(x); 
     } 
     else if (x.contains("?")) { 
      questionList.add(x); 
     } 
    } 

    } 
    public ArrayList<String> getLeft(){ 
     return left; 
    } 
    public ArrayList<String> getList() { 
     return questionList; 
    } 
    } 

所以當掃描儀和相應的數據進行初始化,這裏的ArrayList是空的大小爲0。所以,如何解決這個問題?

+0

它看起來總是「簡單」。他們實際上沒有正確填充。你在構造函數中填充它們嗎? – keyser

+0

是的,我做到了。我已經測試了UserScanner,它工作得很好。 –

+0

然後你的測試有點瑕疵。在上面的代碼中運行構造函數後,'left'是空的。 – keyser

回答

0

ArrayList的構造函數不會添加空元素,它只是設置其初始(內部)容量,這意味着它會期望一定數量的元素(避免調整大小)。

所以,new ArrayList<String>(20)爲您提供了容量20

這一個空的ArrayList,有這樣一個場景,strings不包含所有標識符的CLCRLR會導致空的ArrayList結合。