Java 为什么这段代码抛出ArrayIndexOutOfBoundsException?
代码如下:Java 为什么这段代码抛出ArrayIndexOutOfBoundsException?,java,arrays,Java,Arrays,代码如下: public class Deck { private Card[] cards; public Deck() { cards = new Card[52]; String[] ranks = {"ace","two","three","four","five","six","seven","eight","nine","ten","jack","queen","king"}; String[] suits = {"
public class Deck {
private Card[] cards;
public Deck() {
cards = new Card[52];
String[] ranks = {"ace","two","three","four","five","six","seven","eight","nine","ten","jack","queen","king"};
String[] suits = {"hearts","diamonds","clubs","spades"};
for(int i = 0; i < suits.length; i++) {
for(int n = 0; n < ranks.length; n++) {
cards[cards.length] = new Card(ranks[i],suits[n]);
}
}
}
}
为什么呢
cards[cards.length]
因为你试图使用一个不存在的索引<代码>卡片。长度为52,数组为0-51
我怀疑您试图将每张卡插入该阵列,这意味着您需要另一个计数器;)
int-cardIndex=0;
for(int i=0;i<1.length;i++){
对于(int n=0;n
编辑:我没有注意到的是其他人提到的内容-您还可以在卡构造函数中切换等级/套装计数器-也解决了这个问题
因为你试图使用一个不存在的索引<代码>卡片。长度为52,数组为0-51
我怀疑您试图将每张卡插入该阵列,这意味着您需要另一个计数器;)
int-cardIndex=0;
for(int i=0;i<1.length;i++){
对于(int n=0;n
编辑:我没有注意到的是其他人提到的内容-您还可以在卡构造函数中切换等级/套装计数器-也解决了这个问题。问题是卡。长度不是数组中使用的元素总数;它是数组中元素的总数,不管到目前为止在数组中存储了什么。因此,只要执行内部循环,就会尝试访问数组的第52个元素,从而导致您看到的异常
要解决这个问题,请考虑存储一个计数器,它将跟踪下一个自由索引,或者使用一些简单的数学来导出卡应该从其套装和值中插入的位置。例如,由于在外部循环的每次迭代中,您将向数组写入
ranks.length
元素,因此在迭代(i
,n
)时,您将向数组索引i*ranks.length+n
)写入。使用它,您可以将内部循环重写为
// Careful... still buggy!
for(int i = 0; i < suits.length; i++) {
for(int n = 0; n < ranks.length; n++) {
cards[i * ranks.length + n] = new Card(ranks[i],suits[n]);
}
}
但是,i
的范围超过了套装,而不是数值。正确的代码应该是
new Card(ranks[n],suits[i]);
这将最终实现:
for(int i = 0; i < suits.length; i++) {
for(int n = 0; n < ranks.length; n++) {
cards[i * ranks.length + n] = new Card(ranks[n],suits[i]);
}
}
for(int i=0;i
不过,更一般地说,不要使用数组的.length
字段来跟踪使用的元素数量。你需要把它分开存放。或者,考虑使用<代码> ARAYLISTAB/COD>,它封装一个数组并为您跟踪。
希望这有帮助 问题在于卡。长度不是数组中使用的元素总数;它是数组中元素的总数,不管到目前为止在数组中存储了什么。因此,只要执行内部循环,就会尝试访问数组的第52个元素,从而导致您看到的异常
要解决这个问题,请考虑存储一个计数器,它将跟踪下一个自由索引,或者使用一些简单的数学来导出卡应该从其套装和值中插入的位置。例如,由于在外部循环的每次迭代中,您将向数组写入
ranks.length
元素,因此在迭代(i
,n
)时,您将向数组索引i*ranks.length+n
)写入。使用它,您可以将内部循环重写为
// Careful... still buggy!
for(int i = 0; i < suits.length; i++) {
for(int n = 0; n < ranks.length; n++) {
cards[i * ranks.length + n] = new Card(ranks[i],suits[n]);
}
}
但是,i
的范围超过了套装,而不是数值。正确的代码应该是
new Card(ranks[n],suits[i]);
这将最终实现:
for(int i = 0; i < suits.length; i++) {
for(int n = 0; n < ranks.length; n++) {
cards[i * ranks.length + n] = new Card(ranks[n],suits[i]);
}
}
for(int i=0;i
不过,更一般地说,不要使用数组的.length
字段来跟踪使用的元素数量。你需要把它分开存放。或者,考虑使用<代码> ARAYLISTAB/COD>,它封装一个数组并为您跟踪。
希望这有帮助 等级和西装的索引变量交换。
(不要用手掌伤害头部。)等级和套装的索引变量是交换的。
(不要用手掌伤害头部。)考虑重命名变量:
for(int SUIT = 0; SUIT < suits.length; SUIT++) {
for(int RANK = 0; RANK < ranks.length; RANK++) {
cards[cards.length] = new Card(ranks[SUIT],suits[RANK]);
}
}
愉快的编码。考虑重命名变量:
for(int SUIT = 0; SUIT < suits.length; SUIT++) {
for(int RANK = 0; RANK < ranks.length; RANK++) {
cards[cards.length] = new Card(ranks[SUIT],suits[RANK]);
}
}
快乐的编码。这不是问题所在,但它将是下一个问题!这仍然不能解决他的问题……;)这不是问题,但它会是下一个问题!这仍然不能解决他的问题……;)这不是问题,但它会是下一个问题!当我们谈论更好的编码实践时:使用和新卡[suits.length*cards.length]。。。对于(字符串S:套装)。。。对于(字符串C:卡片)…这不是问题,但它将是下一个问题!当我们谈论更好的编码实践时:使用和新卡[suits.length*cards.length]。。。对于(字符串S:套装)。。。对于(字符串C:卡片)。。。