Arraylist突然被认为是空的

时间:2017-11-25 15:01:36

标签: java arraylist indexoutofboundsexception

我的任务是写一个二十一点游戏,我创建了一个卡片类,它有一个带有值的int变量和一个带有卡片颜色的字符串(心脏,棍棒,钻石和铁锹)。我用一个类“deck”组织卡片,其中包含所有52张卡片的ArrayList。当我想要发卡时,我使用以下代码:

public Card give(){
    Card d = c.get(0); //c is the Arraylist
    c.remove(0);
    return d;
}

由于我必须使用6个套牌,我创建了另一个名为playdeck的类,它有一个包含6个“deck”对象的Array。在这里,我只是使用此代码获取卡片:

class playdeck{enter code here
static int x = 0;
static int y = 0;
static deck[] play = new deck[6];
public playdeck(){
    play[0] = new deck();
    play[1] = new deck();
    play[2] = new deck();
    play[3] = new deck();
    play[4] = new deck();
    play[5] = new deck();

}
public static Card give(){
    y++;
    if(y == 53){
    y = 0;
    x++;
    }
    Card d = play[x].give();
    return d;}

前两个套牌的一切正常,但是一旦程序尝试进​​入第三个套牌对象并获得一张牌,就会出现以下错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out-of-bounds for length 0 at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:372)
    at java.base/java.util.ArrayList.get(ArrayList.java:439)
    at deck.give(deck.java:39)
    at playdeck.give(playdeck.java:23)
    at Blackjack.main(Blackjack.java:5)

当我尝试访问第三个“套牌”对象时,一切正常,以及所有其他“套牌”对象,但是当我试图发出超过2包卡时,程序崩溃了。有没有人知道为什么会这样?这是我的主要方法btw:

public static void main (String[] args){
playdeck blackjack = new playdeck();
for (int x = 0; x < 312; x++){
System.out.println(blackjack.give().name);
}}

1 个答案:

答案 0 :(得分:0)

  1. 您是否确定每次需要时都需要从ArrayList删除卡?因为您可以执行以下操作:

    static int i = 0;
    
    public Card give() {
        return c.get(i++);
    }
    

    即使需要从ArrayList删除对象,也请替换

    public Card give(){
        Card d = c.get(0); //c is the Arraylist
        c.remove(0);
        return d;
    }
    

    public Card give(){
        return c.remove(0);
    }
    

    此处的说明:ArrayList remove docs

  2. 错误在这里:

    public static Card give(){
        y++;
        if(y == 53){
            y = 0;
            x++;
        }
    Card d = play[x].give();
    return d;
    }
    

    因为你只能正确处理第一副牌,而忘记其他牌。此代码将解决您的问题:

    static int i = 0;
    
    public static Card give() {
        i++;
        y = i % 52; //0-51
        x = i / 52; //0-5
        return play[x].give();
    }
    
  3. 请查看Java coding conventions