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 publicandyou 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を52回以上呼び出し続けていると思います。毎回、カードがデッキから取り除かれるので、53:dの時間に、あなたは空のデッキ(つまり、サイズ0のデッキ)からカードを引こうとしているためgenerator.nextInt(cards.size());、例外がスローされます。

しかし、言うのは簡単ではありません。このような問題が発生していてヘルプが必要な場合は、常に例外の完全なスタックトレースを表示してください。また、stackoverflowのコードでは行番号を確認できないため、例外が発生した行を正確にコードで示すようにしてください。

于 2013-01-22T15:20:15.767 に答える
0

PlayerCardDrawカードがリストに追加される前であっても、メソッドを呼び出している可能性があります。手段cards.size()はを返す必要がありますzero。したがって、シードillegalを使用してランダムなintを生成することです。zeroしたがって、エラーです。

参照
Random.nextInt(n)

于 2013-01-22T15:19:27.640 に答える