Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这段代码抛出ArrayIndexOutOfBoundsException?_Java_Arrays - Fatal编程技术网

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:卡片)。。。