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