1

我正在制作纸牌游戏,但我得到了 n 必须为正的错误。我做了一些研究,这意味着我相信 (cards.size) 等于或小于 0,但我不明白如何使我的代码工作,一定是有问题。

代码:

public class Deck
{
public ArrayList <Card> cards;
Deck()
{
    cards = new ArrayList<>();
    for (int a = 0; a < 52; a++)
    {           
            cards.add(new Card(a));         
    }
}

public Card PlayerCardDraw ()
{
    Random generator = new Random ();
    int index = generator.nextInt (cards.size ());
    return cards.remove (index);

}

如何修复我的数组列表,以免出现此错误?它与 Card 有关,所以我也会发布该代码,我知道我的 Card 类中有些地方不对,但我不知道这是否是问题所在。

public class Card
{
int c = 52;
int cardpath[] = new int[c];

Card ()
{

}


public Card(int c)
{
    this.c = c;
}

public int getCardPath()
{
return cardpath[c];
}   
}

错误信息:

java.util.Random.nextInt(Unknown Source) at Cards.Deck.PlayerCardDraw(Deck.java:21)
line 21 is int index = generator.nextInt (cards.size ());

编辑:我按照 Nankumar Tekale 所说的做了,正如你们预测的那样:它绘制了超过 52 张牌。我不明白的是错误正在弹出

for (int i = 0 ; i < 4 ; i++)
    {
        C = deck.P1CardDraw ();
        card [cardNum].draw (i*75+100, 400); //Error line
        cardNum++;                   
    }

我的 P1CardDraw() 类

public ArrayList < Card > p1Hand;
public ArrayList < Card > P1CardDraw ()
{

    p1Hand = new ArrayList < > ();
    p1Hand.add (PlayerCardDraw ());
    return p1Hand;
}
4

3 回答 3

1

看看你的Deck类,你已经在构造函数中初始化cards了,所以不应该有这样的异常(因为卡片大小是 52)。

但有一件事可能会得到一个例外,即cards is declared publicand you may have modified it outside class directly。因此,arraylistcards的大小为 0,并且您的方法会收到 IllegalArgumentException 异常Random.nextInt(int)

设为cards私有。

如果您已经取出所有卡片,则 arraylist 的大小将变为 0,这可能会导致异常。添加检查 0 为:

public Card PlayerCardDraw ()
{
    Random generator = new Random ();
    if(cards.size() > 0) {
        int index = generator.nextInt (cards.size());
        return cards.remove (index);
    } else {
        return null;
    }
}
于 2013-01-22T15:26:23.383 回答
0

PlayerCardDraw您甚至可能在将卡片添加到列表之前调用方法。手段cards.size()必须返回一个zero. 所以它是illegal使用zero种子生成一个随机整数。因此是错误。

参考
Random.nextInt(n)

于 2013-01-22T15:19:27.640 回答
0

我的猜测是你一直调用 PlayerCardDraw 超过 52 次。每次,从牌组中取出一张牌,因此在 53:d 时间,您试图从一个空牌组(即大小为 0 的牌组)中抽一张牌,这会导致generator.nextInt(cards.size());抛出异常。

然而,这并不容易说。当您遇到此类问题并需要帮助时,请始终显示异常的完整堆栈跟踪。此外,由于我们无法在 stackoverflow 上看到代码中的行号,因此请务必在代码中准确指出异常发生在哪一行。

于 2013-01-22T15:20:15.767 回答