看看以下用于构建卡片组的代码。我正在使用 xFactor“变量”(硬编码)从数组大小中减去 1 以调整零索引。我注意到,在遇到“java.lang.ArrayIndexOutOfBoundsException: 12”错误之前,我实际上总共可以减去 40。
如果我输入 39 作为 xFactor,它运行得非常好。它构建了整个牌组,所有 52 张牌,尽管奇怪的是,cards.length 将等于每个循环两侧的 deckTotal - xFactor?!?这没有意义,因为它需要达到 51 的索引才能构建整个甲板,它确实......
public void constructDeck(){
int deckTotal = SUITS.length * CARDS_PER_SUIT;
System.out.println(deckTotal); // 52
Card[] cards = new Card[deckTotal - xFactor];
System.out.println(cards.length); // Prints deckTotal - xFactor
for(String cardSuit : SUITS){
int cardNum = 1;
while(cardNum <= CARDS_PER_SUIT){
String cardDesc = cardDescription(cardNum);
int cardValue = cardNum;
if(cardNum >= VALUE_CEILING){
cardValue = VALUE_CEILING;
}
cards[cardNum -1] = new Card(cardDesc,cardSuit,cardValue);
this.deck.addCard(cards[cardNum -1]);
//System.out.println(cardDesc + " of " + cardSuit + " added to the deck");
cardNum++;
}
}
System.out.println(cards.length); // prints: deckTotal - xFactor
}
我唯一能想到的是,内存正在从阵列的开始被修剪,以便腾出空间新卡被添加到后面。所以这意味着 ArrayIndexOutOfBoundsException 实际上只是我的计算机处理循环和/或收集垃圾的速度的函数。
我编写这段代码只是为了测试 Java 类介绍的一个非常基本的任务。来自 JS 背景,在使用之前声明数组的大小似乎有点奇怪(尽管我明白为什么)。不过,这里的行为确实出乎意料,我很好奇幕后发生了什么。
更新: 谢谢你的建议。这是我根据您的建议编写的最终代码。
public void constructDeck(){
for(String cardSuit : SUITS){
int cardNum = 1;
while(cardNum <= CARDS_PER_SUIT){
String cardDesc = cardDescription(cardNum);
int cardValue = cardNum;
if(cardNum >= VALUE_CEILING){
cardValue = VALUE_CEILING;
}
this.deck.addCard(new Card(cardDesc,cardSuit,cardValue));
cardNum++;
}
}
}