繁体   English   中英

实现自己的类java时出现NullPointerException错误

[英]NullPointerException error when implementing own class java

我正在做纸牌计数程序。 我已经有主程序在工作,但是当我尝试实现自己的类时,在第19行(无论何时到达c.getRank )都会收到NullPointerException错误。

请注意,在导入名为CardDeck的类时,我首先创建了我的主程序,该类具有执行它所需的所有功能,但现在我应该创建自己的类,该类具有完全相同的功能。 (请注意,我无权访问导入的CardDeck类)。

这是主要代码:

import se.lth.cs.ptdc.cardGames.Card;

public class Patiens {
public static void main(String[] args) {
    double good = 0;
    double bad = 0;
    double result = 0;

    for (int a = 0; a < 1000000; a++) {
        CardDeck deck = new CardDeck();
        deck.shuffle();
        double fail = 0;
        while (deck.moreCards()) {

            for (int i = 1; i <= 3 && deck.moreCards(); i++) {

                Card c = deck.getCard();

                if (i == 1 && c.getRank() == 1) {
                    fail++;
                }

                if (i == 2 && c.getRank() == 2) {
                    fail++;
                }

                if (i == 3 && c.getRank() == 3) {
                    fail++;
                }
            }
        }
        if (fail >= 1) {
            bad++;      
        }
        else{
            good++;
        }
    }
    System.out.println("Good: " + good + " Bad: " + bad);
    result = good / bad;
    System.out.println("Result= " + result);
}

}

它所做的是计算我的牌组成功完成的概率:

它同时计数1-2-3、1-2-3,同时抓一张牌。 现在,如果卡在计数为“ 1”时恰好是ACE,则当前卡座将失效。 程序计数为“ 2”时,等级2的卡也是如此。一旦完成,它不会失败的概率为0.8%。

这是我正在创建的CardDeck类:

import se.lth.cs.ptdc.cardGames.Card;

import java.util.Random;

public class CardDeck {
    private Card[] cards;
    private int current;
    private static Random rand = new Random();

    public CardDeck() {
        cards = new Card[52];
        for(int suit = Card.SPADES; suit <= Card.CLUBS; suit++) {
            for (int i = 0; i < 13; i++) {
                cards[i * suit] = new Card(suit, i);
            }
        }
        current = 0;
    }

    public void shuffle() {
        Card k;
        for(int i = 1000; i > 0; i--) {
            int nbr = rand.nextInt(52);
            int nbr2 = rand.nextInt(52);
            k = cards[nbr2];
            cards[nbr2] = cards[nbr];
            cards[nbr] = k;
        }
    }

    /**
     *Checks for more cards
     */
    public boolean moreCards() {
        if(current > 51) {
            return false;
        } else {
            return true;
        }
    }

    /**
     *Draws the card lying on top.
     */
    public Card getCard() {
        return cards[current++];

    }
}

这是import se.lth.cs.ptdc.cardGames.Card; 如果需要,则是创建卡的类。

package se.lth.cs.ptdc.cardGames;

public class Card {
    public static final int SPADES = 1;
    public static final int HEARTS = SPADES + 1;
    public static final int DIAMONDS = SPADES + 2;
    public static final int CLUBS = SPADES + 3;

    private int suit;
    private int rank;

    public Card(int suit, int rank) {
        this.suit = suit;
        this.rank = rank;
    }

    public int getSuit() {
        return suit;
    }

    public int getRank() {
        return rank;
    }
}

(请注意,我不应该更改上面的类)

您的问题在这里:

cards[i * suit] = new Card(suit, i);

如果将其更改为:

cards[i + ((suit - 1) * 13)] = new Card(suit, i);

它会做您期望的。

需要考虑两件事:首先,数组是从零开始的 ,因此您的第一张卡片必须在索引0处。其次,通过乘以西服,您将获得该数字的倍数,例如:

  • 空格:1、2、3、4、5、6、7、8、9、10、11、12、13
  • 心:2,4,6,8,10 ...
  • 钻石:3,6,9,12 ...
  • 俱乐部:4,8,12,16 ...

因此,某些元素将被填充一次以上(12次被填充四次),而某些元素(特定质数> 13)(例如23个)将为空。 通常,用另一个变量来表示索引就足够了,就像这样:

int cardIndex = 0;
for (int suit = Card.SPADES; suit <= Card.CLUBS; suit++) {
    for (int i = 0; i < 13; i++) {
        cards[cardIndex++] = new Card(suit, i);
    }
}

数组CardDeck.cards包含null元素,因为在使用基于1的索引(在Card.SPADES这样做)时, i * suit不符合您的期望

看来CardDeck类的getCard()方法返回null而不是返回Card对象。 在返回之前,检查getCard()方法并打印Card obj。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM