涉及越界异常的ArrayList错误

时间:2016-06-23 00:11:05

标签: java list arraylist get indexoutofboundsexception

使用edwards修改后的代码,我现在有了这个:

        int k, l, tempA, tempB;
    for (k = 0; k < 13; k++) {
    for (l = 0; l < 4; l++) {
    tempA = rndm.get(k);
    tempB = suit.get(l);
    // increment # and convert into string
    buttonNumber++;
    buttonName = Integer.toString(buttonNumber);
    // assign new button to the array
    cardButton[k * 4 + l] = new JButton(buttonName);
    // assign button image icon
    cardButton[k * 4 + l].setIcon(cardImage[tempA][tempB]);
    // assign value to the check variable
    check[k * 4 + l] = Integer.toString(tempA+1);
    // make button invisible for now
    cardButton[k * 4 + l].setVisible(false);
    // add the button to the board
    board.add(cardButton[k * 4 + l]);
}

}

但我的问题是我需要替换嵌套循环,因为它现在设置的方式,它在显示下一个值之前显示4个不同套装的x值,当我需要它显示它时除非随机完成,否则x值和x套装不重复一次值。发生这种情况的原因是嵌套循环遍历k一次,然后遍历l四次。

3 个答案:

答案 0 :(得分:0)

我相信您的for-loop条件不正确。 在j < 52 || k < 13 || l < 4之前,j >= 52将返回true。查看你的代码,这会引发一个越界错误,因为kl也会增加到52.如果我是你,我会把它们放在不同的条件下。

您希望迭代2D数组(根据您的评论)。在这种情况下,我会使用2 for-loops

for (k = 0; k < 13; k++) {
    for (l = 0; l < 4; l++) {
        tempA = rndm.get(k);
        tempB = suit.get(l);
        cardButton[k * 4 + l].setIcon(cardImage[tempA][tempB]);
        check[k * 4 + l] = Integer.toString(tempA+1);
    }
}

请注意,我们正在用一些数学代替您的j变量。每次执行l循环时,k都会加1。因此,我们可以通过将k乘以4来判断我们在哪张卡上,因为l经历了4次。如果我们添加l,我们就可以获得您正在查看的当前卡片。此代码应该可以直接使用。

编辑:您的完整代码应如下所示。

int k, l, tempA = 0, tempB = 0;
    // create temporary variables
for (k = 0; k < 13; k++) {
    for (l = 0; l < 4; l++) {
        tempA = rndm.get(k);
        tempB = suit.get(l);
        // increment # and convert into string
        buttonNumber = buttonNumber+1;
        buttonName = Integer.toString(buttonNumber);
        // assign new button to the array
        cardButton[k * 4 + l] = new JButton(buttonName);
        // assign button image icon
        cardButton[k * 4 + l].setIcon(cardImage[tempA][tempB]);
        // assign value to the check variable
        check[k * 4 + l] = Integer.toString(tempA+1);
        // make button invisible for now
        cardButton[k * 4 + l].setVisible(false);
        // add the button to the board
        board.add(cardButton[k * 4 + l]);
    }
}

此外,您可以使用buttonNumber = buttonNumber + 1

,而不是buttonNumber++

答案 1 :(得分:0)

如果您尝试获取rndmsuit的每个排列,那么您需要一个嵌套循环:

for (int i = 0; i < 13; i++) {
    for (int j = 0; j < 4; j++) {
        tempA = rndm.get(i);
        tempB = suit.get(j);
        //...
    }
}

答案 2 :(得分:0)

您误解了逻辑运算符的工作原理。双竖条是“或”运算符。它需要两个可以转换为布尔值的表达式,如果至少其中一个为真,则返回true。

boolean test = (1 == 2 || 5 < 3);
// test == true

你的for循环在数组边界之外迭代。让我们简化一下你的代码。让我们创建两个固定大小的数组,1和2个元素,然后在类似于你的循环中迭代它们。

Integer[] arrayA = new Integer[1];
Integer[] arrayB = new Integer[2];

for (int i = 0, j = 0; i < 1 || j < 2; i++, j++) {
    arrayA[i] = i; // Will throw ArrayIndexOutOfBounds
    arrayB[j] = j;
}

现在,让我们看看在循环执行期间计数器将如何变化:

  1. i == 0j == 0i < 1 == truej < 2 == true,我们会增加
  2. i == 1j == 1i < 1 == false但仍然是j < 2 == true,其中一个条件为真(我们只需要一个为|| }运算符返回true)所以即使i索引超出范围,也会执行循环代码!
  3. 出于同样的原因,您的代码会抛出异常。即使l < 4 == false,整个条件的计算结果为true,也会执行循环代码。

    您想要的是将所有||运算符更改为&&

    for (j = 0, k = 0, l = 0; j < 52 && k < 13 && l < 4; j++, k++, l++)
    

    您可以在此处详细了解布尔代数以及andor运算符之间的差异 - http://www.tutorialspoint.com/computer_logical_organization/boolean_algebra.htm

    在旁注中,不要做那样的循环。你可能已经注意到,一个陈述中的许多变量都非常令人困惑。如果您总是访问与计数器变量具有完全相同索引的对象,请考虑使用enchanced for loops