0

我在下面的代码中有一个 arrayoutofindexexception:

    ImageView[] bObject = new ImageView[9];

    private void getCorrectObject() {

    List<Integer> objects = new ArrayList<Integer>();
    objects.add(1);
    objects.add(2);
    objects.add(3);
    objects.add(4);
    objects.add(5);
    objects.add(6);
    objects.add(7);
    objects.add(8);
    objects.add(9);

    Collections.shuffle(objects);
    int correctObject =  objects.get(0);
    Log.d("test", String.valueOf(correctObject));

            bObject[correctObject + 1].setImageResource(R.drawable.stage1_4_object1);
    bObject[correctObject + 1].setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
                goToNextQuestion();
            }
        });
            }


           //TODO initControls
private void initControls() {

    bObject[0] = (ImageView) findViewById(R.id.bObject1Stage1_4);
    bObject[0].setImageResource(R.drawable.stage1_4_object2);
    bObject[1] = (ImageView) findViewById(R.id.bObject2Stage1_4);
    bObject[1].setImageResource(R.drawable.stage1_4_object2);
    bObject[2] = (ImageView) findViewById(R.id.bObject3Stage1_4);
    bObject[2].setImageResource(R.drawable.stage1_4_object2);
    bObject[3] = (ImageView) findViewById(R.id.bObject4Stage1_4);
    bObject[3].setImageResource(R.drawable.stage1_4_object2);
    bObject[4] = (ImageView) findViewById(R.id.bObject5Stage1_4);
    bObject[4].setImageResource(R.drawable.stage1_4_object2);
    bObject[5] = (ImageView) findViewById(R.id.bObject6Stage1_4);
    bObject[5].setImageResource(R.drawable.stage1_4_object2);
    bObject[6] = (ImageView) findViewById(R.id.bObject7Stage1_4);
    bObject[6].setImageResource(R.drawable.stage1_4_object2);
    bObject[7] = (ImageView) findViewById(R.id.bObject8Stage1_4);
    bObject[7].setImageResource(R.drawable.stage1_4_object2);
    bObject[8] = (ImageView) findViewById(R.id.bObject9Stage1_4);
    bObject[8].setImageResource(R.drawable.stage1_4_object2);

            for (ImageView bObj  : bObject) {
                   bObj.setOnClickListener(this);
            }

我在这一行遇到错误:

        bObject[correctObject + 1].setImageResource(R.drawable.stage1_4_object1);

我不知道这有什么问题。如果您发现问题所在,我们将不胜感激任何帮助。谢谢

4

3 回答 3

5

数组是从零开始的。这里使用的值超出了数组的范围bObject。采用

将值添加到从List开始0

objects.add(0);
...
objects.add(8);

并使用:

bObject[correctObject].setImageResource(...);

或者,您可以使用:

for (int i=0; i < bObject.length; i++)
   objects.add(i);
}

这将消除对索引值进行硬编码的需要。

要完全消除objects索引List,可以使用Random#nextInt ,例如:

bObject[random.nextInt(bObject.length)].setImageResource(...);
于 2013-04-26T14:57:50.187 回答
0

数组在 Java 中是 0 - 第一个索引是 0。所以 bObject 的有效范围是 0...8。正确对象的值将是随机的 1...9。将 1 添加到它会带来 2...10。因此,如果您得到 9 或 10,则表示您访问的范围超出了数组范围。你有 20% 的机会这样做并崩溃。

您可能想减去 1,而不是添加它。

于 2013-04-26T14:58:18.743 回答
0

你应该说 bObject[correctObject - 1].setImageResource(R.drawable.stage1_4_object1);

因为正确的对象值可能是 9,你可以给 bObject 的最大索引是 8。

于 2013-04-26T15:00:52.327 回答