java.lang.IllegalArgumentException:n在deck类中必须为正
我在做一个纸牌游戏,我得到一个错误,n必须是正的。我做了一些研究,这意味着(cards.size)等于或小于0,我相信,但我不明白如何使我的代码工作,一定是出了问题 代码: 错误消息:java.lang.IllegalArgumentException:n在deck类中必须为正,java,Java,我在做一个纸牌游戏,我得到一个错误,n必须是正的。我做了一些研究,这意味着(cards.size)等于或小于0,我相信,但我不明白如何使我的代码工作,一定是出了问题 代码: 错误消息: java.util.Random.nextInt(Unknown Source) at Cards.Deck.PlayerCardDraw(Deck.java:21) line 21 is int index = generator.nextInt (cards.size ()); 编辑:我做了Nankumar
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++;
}
for(int i=0;i<4;i++)
{
C=deck.P1CardDraw();
卡片[cardNum]。绘制(i*75+100400);//错误行
cardNum++;
}
我的P1CardDraw()类
public ArrayListp1Hand;
公共阵列列表P1CardDraw()
{
p1Hand=新阵列列表<>();
p1Hand.add(PlayerCardDraw());
回手;
}
甚至在将卡片添加到列表之前,您可能正在调用PlayerCardDraw
方法。表示cards.size()
必须返回一个0
。因此,使用零
种子生成随机整数是非法的。这就是错误所在
参考:甚至在将卡片添加到列表之前,您可能正在调用
玩家卡片绘制
方法。表示cards.size()
必须返回一个0
。因此,使用零
种子生成随机整数是非法的。这就是错误所在
参考:我猜你给PlayerCardDraw打了52次电话。 每次都会从牌组中移除一张牌,因此在53:d时间,您尝试从空牌组(即大小为0的牌组)中抽取一张牌,这会导致
generator.nextInt(cards.size())
以引发异常
然而,这并不容易说。
当您遇到类似问题并需要帮助时,始终显示异常的完整堆栈跟踪。此外,由于我们无法在stackoverflow上的代码中看到行号,请确保在代码中明确指出异常发生的行号。我猜您一直在调用PlayerCardDraw超过52次。 每次都会从牌组中移除一张牌,因此在53:d时间,您尝试从空牌组(即大小为0的牌组)中抽取一张牌,这会导致
generator.nextInt(cards.size())
以引发异常
然而,这并不容易说。
当您遇到类似问题并需要帮助时,始终显示异常的完整堆栈跟踪。此外,由于我们无法在stackoverflow上的代码中看到行号,请确保在代码中准确地指出异常发生的行。仔细查看您的
甲板
类,您已经在构造函数中初始化了卡片
,因此不应该存在此类异常(因为卡片大小为52)
但是有一件事是可能得到一个例外,那就是卡被声明为公共的
,并且您可能已经在类外直接修改了它
。因此,arraylistcards
的大小为0,并且您的方法将获得IllegalArgumentException异常
使卡成为私有卡
若您已取出所有卡,则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;
}
}
看看你的Deck
类,你已经在构造函数中初始化了cards
,所以不应该有这样的异常(因为cards的大小是52)
但是有一件事是可能得到一个例外,那就是卡被声明为公共的
,并且您可能已经在类外直接修改了它
。因此,arraylistcards
的大小为0,并且您的方法将获得IllegalArgumentException异常
使卡成为私有卡
若您已取出所有卡,则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;
}
}
它给你的错误在哪里?可以发布错误消息/堆栈跟踪吗?cards=new ArrayList();应该是ArrayList();我猜。@Adio那是类型推断,它在java7中可以工作,但是PlayerCardDraw()
被调用的次数太多,清空卡,并导致0
被发送到nextInt()
。它在哪里给您带来错误?可以发布错误消息/堆栈跟踪吗?cards=new ArrayList();应该是ArrayList();我猜。@Adio那是类型推断,它在java7中可以工作,但是PlayerCardDraw()
被调用的次数太多,清空卡片
,导致0
被发送到nextInt()
。我也这么想,但他需要通过初始化数组的甲板构造函数。我也这么想,但是他需要通过初始化数组的Deck构造函数。我找到了应该发生的地方,编辑了我的问题,并在那里发布了代码。它正在运行一个只运行4次的for语句,应该重置为53,而不是4,对吗?我找到了应该发生的地方,编辑了我的问题,并在那里发布了代码。它正在运行一个只运行4次的for语句,它应该重置为53,而不是4,对吗?这修复了我遇到的错误,但现在仍然返回null;正在尝试修复它。@HaydenHolligan我建议您在playerCardDraw()
method,jus中添加一条打印语句
public ArrayList < Card > p1Hand;
public ArrayList < Card > P1CardDraw ()
{
p1Hand = new ArrayList < > ();
p1Hand.add (PlayerCardDraw ());
return p1Hand;
}
public Card PlayerCardDraw ()
{
Random generator = new Random ();
if(cards.size() > 0) {
int index = generator.nextInt (cards.size());
return cards.remove (index);
} else {
return null;
}
}