ArrayList和IndexOutOfBounds异常

Uvr*_*vrD 0 java indexoutofboundsexception

所以我在写一些代码时得到一个索引超出范围的异常.我不明白的是,我知道我正在尝试使用的索引元素存在.

这是代码:

我有一个数组列表的构造函数

    public StixBoard(int number)
{
    stixGame = new ArrayList<Integer>(number);

    for (int i = 0; i < number; i++)
    {
        stixGame.add(i);
    }

}
Run Code Online (Sandbox Code Playgroud)

该块生成随机变量1-3

public int computeMove()
{

    int numberOfStix = (int) (3.0 * Math.random()) + 1;

    return numberOfStix;
}
Run Code Online (Sandbox Code Playgroud)

真的很直接,现在我在这里有一个方法,它接受提供的参数,并尝试从数组列表中删除这些数量的元素.如您所见,参数必须介于1和3之间,且必须小于或等于数组列表的大小.否则,提示用户输入另一个号码

public boolean takeStix(int number)
{
    boolean logicVar = false;
    placeHolder = stixGame.size();

    if ((number >= 1 && number <= 3) && number <= placeHolder)
    {
        for (int i = 0; i < number; i++)
        {
            stixGame.remove(i);
            logicVar = true;
        }
    } else if (number > 3 || number > placeHolder)
    {
        do
        {
            System.out
                    .println("Please enter a different number, less than or equal to three.");
            Scanner numberScan = new Scanner(System.in);
            number = numberScan.nextInt();
        } while (number > 3 || number > placeHolder);
    }

    return logicVar;
}
Run Code Online (Sandbox Code Playgroud)

因此,当该程序运行时,computeMove()方法生成随机int(假设计算机化播放器的角色)并尝试将该值转换为要从数组列表中删除的索引数.

这最终让我想到了这个:

How many stix on the table? 4
|||||||||| 4 stix on the table
It's the computer's turn!
The computer chose 3

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.RangeCheck(ArrayList.java:547)
at java.util.ArrayList.remove(ArrayList.java:387)
at StixBoard.takeStix(StixBoard.java:38)
at StixGame.main(StixGame.java:55)
Run Code Online (Sandbox Code Playgroud)

所以你可以看到,数组列表大小为4,但是当计算机滚动一个3时(这应该让我留下1),我留下了这个错误.我的数组列表如何从大小为4的索引变为大小为2?

JB *_*zet 6

您从头到尾遍历列表,并在每个步骤中删除元素.这使列表中的所有元素都向左移动.

第一次迭代:i = 0

[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

第二次迭代:i = 1

[2, 3]
Run Code Online (Sandbox Code Playgroud)

第三次迭代:i = 2

[2] -> IndexOutOfBoudsException. There is no index 2 in this list.
Run Code Online (Sandbox Code Playgroud)

从头到尾迭代而不是.这将使其正确,更快,因为列表不必从右到左复制所有元素.