1

BlackJack Java ゲームでエラーが発生しました。エラーは次のとおりです。

Exception in thread "main" java.lang.NullPointerException
at com.keegan.game.blackjack.Deck.createDeck(Deck.java:48)
at com.keegan.game.blackjack.Deck.<init>(Deck.java:33)

そして、このコードの何が問題なのか、私にはまったくわかりません。エラーが間違っていることを私に伝えていることを理解するのを手伝ってくれる人はいますか?

のコードは次のDeck.javaとおりです。

public class Deck {

private ArrayList<Card> deck = new ArrayList<Card>();

private List<Card> cardUsed = new ArrayList<Card>();
Card c = new Card(null, null, null, 0);

public Deck(int numCards) {
    this.createDeck(numCards, 4, null);
}

private void createDeck(int numCards, int numSuits, String[] cardRanks) {
    deck = new ArrayList<Card>();
    cardUsed = new ArrayList<Card>();
    if ((numCards % numSuits) > 0) return;
    for (int i=0; i < numSuits; i++) {
        for(int j=1; j <= (numCards / numSuits); j++) {
            deck.add(new Card(new Suit(i), cardRanks[j-1], cardRanks, j));
        }
    }
}

public Card dealCard( ) {

    Card dealtCard = null;
    if (deck.size() == 0){
        deck.addAll(cardUsed);
        this.shuffle();
        cardUsed = new ArrayList<Card>();
    }

    dealtCard = deck.get(0);
    deck.remove(0);
    cardUsed.add(dealtCard);

    return dealtCard;
}

public void shuffle() {
    Collections.shuffle(deck);
}

public ArrayList<Card> getDeck() {
    return deck;
}

public void setDeck(ArrayList<Card> deck) {
    this.deck = deck;
}
public int getNumUsedCards() {
    return cardUsed.size();
}

public List<Card> getCardUsed() {
    return cardUsed;
}

public void setCardUsed(List<Card> cardUsed) {
    this.cardUsed = cardUsed;
}
4

3 に答える 3

3

あなたはnull配列を渡しています

this.createDeck(numCards, 4, null);

cardRanks[j-1]後でステートメントのようにアクセスします

deck.add(new Card(new Suit(i), cardRanks[j-1], cardRanks, j));

編集
おそらく必要なのは、Deckas

this.createDeck(numCards, 4);

Cardasを追加する

deck.add(new Card(new Suit(i), j));

なぜなら、クラスString[] cardRanksですでに初期化されているからです。そして、カードのランクについて知る必要がないCardため、デザイン的には正しいです。それをカプセル化する必要があり、おそらくComparable も実装します。DeckCard

于 2013-06-28T15:15:26.657 に答える
1

コンストラクターで、変数として null を渡しました

public Deck(int numCards) {
    this.createDeck(numCards, 4, null);
}

メソッド createDeck 内で、その変数を使用しようとします

private void createDeck(int numCards, int numSuits, String[] cardRanks) { //<---cardRanks is null at this point
    deck = new ArrayList<Card>();
    cardUsed = new ArrayList<Card>();
    if ((numCards % numSuits) > 0) return;
    for (int i=0; i < numSuits; i++) {
        for(int j=1; j <= (numCards / numSuits); j++) {
            deck.add(new Card(new Suit(i), cardRanks[j-1], cardRanks, j)); 
        }
    }
}

あなたが書いているときcardRanks[j-1]は、cardRanks の「内部」にアクセスしようとしています。cardRanks が null の場合、つまり存在しない場合は、内部にアクセスできず、aNullPointerExceptionが唯一のオプションです。Java が不平を言うのは当然です。

英語では、(cardRanks が null の場合) プログラムに指示していることは、「何もない」要素の j-1 を取得することです。これは明らかに無意味でありNullPointerException、コンパイラがあなたに伝える方法です


null ではない文字列の配列の作成

String[] stringArray=new String[10]; //creates an array big enough to hold 10 Strings

現在、stringArray は 10 個の null を保持しています

stringArray[0]="hi"; //enter first element
stringArray[1]="hi again"; //enter second element
stringArray[2]=""; //empty string is not the same as null

最初の 3 つの要素は null ではなく、残りの 7 つの要素は null のままです

もちろん、ループ内または任意の方法で文字列を作成できます

コンストラクターでフィールドを取得する必要のないクラスを作成する

public class SomeClass {
    String[] someStringArray={"hello", "i'm just fine as I am"}; //creates an array of strings, 2 entries

    int someNumber;

    public SomeClass(int someNumber){
        //this constructor leaves someStringArray alone, its fine as it is
        this.someNumber=someNumber;

    }

    public SomeClass(int someNumber,String[] someStringArray){
        //this constructor changes someStringArray
        this.someNumber=someNumber;
        this.someStringArray=someStringArray;

    }

}
于 2013-06-28T15:16:39.707 に答える
0
deck.add(new Card(new Suit(i), cardRanks[j-1], cardRanks, j));

この行では、cardRanks は null です。メソッドを次のように呼び出したように

this.createDeck(numCards, 4, null);

空配列(:p)の要素にはアクセスできません

于 2013-06-28T15:17:40.900 に答える