2014-02-17 3 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, и он работает так, как я предполагал. Он содержит данные в пяти ArrayLists (левый, центральный, centerLeft, right, centerRight), который, как я знаю, заполняется правильно, как я хочу, чтобы они были. Тем не менее, когда я бегу 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; 
    } 
    } 

Таким образом, хотя сканер инициализируется с соответствующими данными, то ArrayLists здесь пусто и размер 0. Так как же я могу решить эту проблему?

+0

Это всегда «просто», как кажется. На самом деле они неправильно заполнены. Вы заполняете их в конструкторе? – keyser

+0

Да, я сделал это. Я протестировал UserScanner, и все работает отлично. –

+0

Тогда ваш тест некорректен. После запуска конструктора в коде выше, 'left' пуст. – keyser

ответ

0

Конструктор для ArrayList не содержит пустых элементов, он просто устанавливает начальную (внутреннюю) емкость, что означает, что он ожидает определенное количество элементов (избегая изменения размера).

Итак, new ArrayList<String>(20) дает пустой ArrayList мощности 20.

Это, в сочетании со сценарием, где strings не содержит все идентификаторы CL, CR, L, R приведет к пустому ArrayLists.

Смежные вопросы