【问题标题】:ArrayList OutOfBounds - Java (Android) programmingArrayList OutOfBounds - Java (Android) 编程
【发布时间】:2012-11-30 17:10:58
【问题描述】:

LogCat 输出的错误指向 QuestionView.java 的第 37 行,我将在下面的代码中对其进行注释。下面我有 4 个类的 4 个 sn-ps。我也有来自 LogCat 的输出。

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...

问题.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; }
  }

测验.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...

LogCat

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)

感谢任何帮助或输入!提前谢谢你。

【问题讨论】:

  • 这是一个例外。确保您引用的 Array 项值已正确初始化并且没有 null 值。

标签: java android arraylist indexoutofboundsexception


【解决方案1】:

将你的 for 循环条件更改为:

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

并确保在使用之前初始化queries ArrayList

【讨论】:

    【解决方案2】:

    您不会调用 getRandom10() 方法来初始化列表。

    编辑
    您还使用了 Quiz 类的糟糕设计:

    1. tenQs 是您使用来自non-static 列表qList 的数据填充的static 列表。

    2. 还有tenQspublic,可以通过类直接访问它:Quiz.tenQs。我想将其设为 privatenon-static 并在 conturtor 内部调用 getRandom10 以确保正确初始化您的 Quiz

    3. 将随机索引设为:

    代码:

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

    我明白了。如果您在for 内部使用条件&lt; tenQs.size(),则此for 将不会执行,因为tenQs 的实际大小为0,但容量为10。因此,您必须在测验中创建包含问题数量的常量,并在此 for 循环中使用它。

    【讨论】:

    • 找到了。我将 getTenQs() 和 getRandomTen() 组合成一种方法: public ArrayList getRandom10() { for(int i = 0; i
    • 另外,不知道为什么我有 tenQs 是静态的。一定是我刚才摆弄的东西,忘了把它改回来。我只是把它改回非静态的。
    • 您必须在 onCreate 内写入 for(int i = 0; i &lt; queries.size(); i++),也如 imran 所述。什么不起作用?
    • 当我单击 MainMenu 上的“开始”按钮时,会出现一个带有 TextView 和 4 个按钮的新活动,但它们都是空字符串,因此什么也没有出现。它们应该从 getQuery()、getA1()、getA2()、getA3() 和 getA4() 填充,但显然有些东西不起作用。
    • 如果有帮助,请接受我的回答)
    【解决方案3】:

    qList.size()+1 = 11 所以 random 会给出 0 到 10 之间的任何数字...所以如果数字是从 0 到 9 很好,但是 10 会导致您的程序失败....

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-24
      • 2015-09-10
      • 2018-01-05
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多