CodeOutOfBoundsException代码运行一段时间后

时间:2015-03-15 02:11:05

标签: java arrays

我有一组10张牌。在"转"的过程中,我将一张卡添加到阵列中,然后从阵列中移除一张卡(并不总是相同的。)该代码适用于前6-7轮,然后在尝试从阵列中获取特定的卡时抛出IndexOutofBoundsException错误。它是getCard中的一些东西,但为什么以前它可以正常工作,特别是当我或多或少地在数组中保留相同数量的对象时?

打印出来: 1. J♥2. 10♣3. 10♦4. 9♠5. 9♦6. 7♥7. 7♣8. 6♣9. 5♣10. 2♦11。2♥

playerDiscardCard = 11

(显示我正在为索引添加+1。)

ArrayList<Card> handCard = new ArrayList<Card>(10);

//Beginning of turn
playerHand.addCard(newCard);

//End of turn
int playerDiscardChoice = scanner.nextInt();
Card playerDiscardCard = playerHand.getCard(playerDiscardChoice-1);
playerHand.removeCard(playerDiscardCard);

//Methods

//where I initialize the playerHand
 public ArrayList buildHand(Deck deck){

    for (int i = 0; i < 10; i++)
    {
        Card newCard = deck.drawFromDeck();
        handCard.add(newCard);
    }
    return handCard;
}
public ArrayList addCard (Card newCard){
    handCard.add(newCard);
    Collections.sort(handCard);
    return handCard;
}

public Card getCard (int index){
    Card returnCard = handCard.get(index);
    return returnCard;
}

public ArrayList removeCard (Card newCard){
    handCard.remove(newCard);
    //Collections.sort(handCard);
    return handCard;
}

//Exception error
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 10,   
Size: 10
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at Marty.company.Hand.getCard(Hand.java:18)
at Marty.company.Main.runHumanTurn(Main.java:103)
at Marty.company.Main.newGame(Main.java:41)
at Marty.company.Main.main(Main.java:15)

2 个答案:

答案 0 :(得分:2)

IndexOutOfBoundsException的信息中,它显示Index: 10, Size: 10。您必须在列表中调用大小为10或更小的getCard(10)

大小为10的列表的索引范围为0到9,因此列表中没有索引10。

当您致电new ArrayList<Card>(10)时,您只是设置其容量而不是其容量。它的大小是它包含的元素数,其容量是它当前可以容纳的元素数。

因此,当您调用new ArrayList<Card>(10)并添加卡时,它仍然只是容量为10且大小为1的ArrayList。看起来您可能需要在初始化ArrayList后添加10张卡。

答案 1 :(得分:0)

您正在创建一个静态大小的数组,但是您没有使用值填充整个数组,这意味着当您对该集合进行随机播放时,您有可能找到其中一个值(在该值的范围内)尚未初始化的数组)。 此外,当您删除卡时,如果您选择尚未初始化的索引,则不会删除卡。意味着数组可以超过其最大大小。