执行我的代码时出现问题:java.lang.NullPointerException

时间:2015-02-28 03:22:31

标签: java

我刚开始学习课程所需的Java。 一切似乎都很好,没有语法错误,但是当我运行我的代码时,我有一个错误

    Exception in thread "main" java.lang.NullPointerException
    at Deck.<init>(Deck.java:18)
    at MainDriver.main(MainDriver.java:17)

这是我的代码。

班级卡

    public abstract class Card {

    public CardValue value;
    public CardSuit suit;

    CardValue [] cardvalue = CardValue.values();
    CardSuit [] cardsuit = CardSuit.values(); 

    public Card () {
        value = cardvalue[0];
        suit = cardsuit[0]; 
    }

    public String toString() {
        return this.suit + " of " + this.value;
    }

    abstract boolean CardCompare(Card P1, Card P2);
    }

Class Deck

import java.util.Random;

public class Deck  {

    Card[] playingCards = new Card[52];

    public Deck() {

        int cardNumber = 0;

        CardValue [] cardvalue = CardValue.values();
        CardSuit [] cardsuit = CardSuit.values(); 

        for (int i = 0; i < 4; i++)
        {
            for(int j = 0; j < 13; j++)    //Error here (Deck.java:18)
            {
                playingCards[cardNumber].value = cardvalue[j];
                cardNumber++;
            }
            playingCards[cardNumber].suit = cardsuit[i];
        }
    }   

    public Card draw() {

        Random rand = new Random();
        int cardDraw = rand.nextInt(52);

        return playingCards[cardDraw];

    }
}

Class Main

public class MainDriver extends Card{

    static final int HANDS = 52;

    boolean CardCompare(Card P1, Card P2)
    {
        if (P1.value.ordinal() > P2.value.ordinal())
            return true;
        else if (P1.suit.ordinal() > P2.suit.ordinal())
            return true;
        else return false;
    }

    public static void main(String[] args) {

        Deck player1 = new Deck();    //Some reason there's a error here too (MainDriver.java:17)
        Deck player2 = new Deck();

        int player1Score = 0, player2Score = 0;
        int CardCounter = 0;

        while(CardCounter < 52)
        {
            player1.draw();
            player2.draw();

            System.out.println(player1 + " " + player2);

            CardCounter++;
        }
        System.out.printf("Final score: Player 1--%d; Player 2--%d", player1Score, player2Score);
    }
}

我不明白为什么MainDriver.java:17完全没有错误。我在Card中使用了abstract,因为我还将它扩展到其他类(还没有工作),我将在那里定义一个不同的布尔值。我在比较主驱动程序中的卡时也遇到了麻烦。

我没有包括CardValue和CardSuit,但他们是公共枚举与西装(俱乐部,钻石,心,黑桃)&amp;价值观(二,三,一直到杰克,女王,国王,王牌)。

2 个答案:

答案 0 :(得分:0)

错误发生的可能性更大:

playingCards[cardNumber].value = cardvalue[j];

因为您从未将新卡分配给playingCards[cardNumber],这是空的。

将您的循环更改为:

    for (int i = 0; i < 4; i++)
    {
        for(int j = 0; j < 13; j++)
        {
            playingCards[cardNumber] = new Card ();
            playingCards[cardNumber].value = cardvalue[j];
            cardNumber++;
        }
        playingCards[cardNumber].suit = cardsuit[i];
    }

同时更改

public abstract class Card

public class Card

因为您无法实例化抽象类。

答案 1 :(得分:0)

如果您认为自己在这条线上获得NPE:

  for(int j = 0; j < 13; j++)    //Error here (Deck.java:18)
你错了。该行的NPE 不可能。该特定行中没有任何内容以任何方式使用引用类型。

检查您是否重新编译了所有代码,并且源代码的版本与您正在使用的已编译类相匹配。

如果我们允许您在构建/运行时出错,那么@Eran已经确定了NPE的合理原因。