引用toString时的NPE

时间:2014-02-17 20:47:44

标签: java nullpointerexception

Error: Exception in thread "main" java.lang.NullPointerException
at Deck.toString(Deck.java:83)
at DeckDriver.main(DeckDriver.java:25)

我完全迷失了为什么我收到此错误消息。 d.toString应该显示52行描述Deck d的代码。

甲板课

import java.util.Random;
public class Deck
{
    private Card[] deck;
    private int nextCard;
    Face face;
    Suit suit;


    /**
     * Default Constructor        
     *
     * <hr>
     * Date created: Feb 17, 2014 
     *
     * 
     */
    public Deck()
    {
        nextCard = 0;
        deck = new Card[52];
        int iCount;
        for(iCount=0; iCount<52; iCount++)
        {
            Card c = new Card(iCount);
        }
    }


    /**
     * Copy Constructor        
     *
     * <hr>
     * Date created: Feb 17, 2014 
     *
     * 
     * @param existingDeck
     */
    public Deck(Deck existingDeck)
    {
        int i;
        for(i=0;i<52;i++)
        {
            this.deck[i] = existingDeck.deck[i];
        }
    }

    /**
     * toString         
     *
     * <hr>
     * Date created: Feb 17, 2014 
     *
     * <hr>
     * @return
     * @see java.lang.Object#toString()
     */
    public String toString()
    {
        int iCount = 0;
        String description = "";
        for(iCount=0; iCount<52;iCount++)
        {
            description += deck[iCount].toString();
        }
        return description;
    }

    /**
     * Shuffles the deck       
     *
     * <hr>
     * Date created: Feb 17, 2014
     *
     * <hr>
     */
    public void shuffle()
    {
        Random r = new Random();
        nextCard = 0;
        int i;
        for(i=0;i<52;i++)
        {
            int x = r.nextInt(52);
            Card c = new Card();
            c=deck[x];
            deck[x]=deck[i];
            deck[i]=c;
        }
    }

    /**
     * Deals individual card.        
     *
     * <hr>
     * Date created: Feb 17, 2014
     *
     * <hr>
     * @return
     */
    public Card dealACard()
    {
        Card c;
        c=deck[nextCard];
        nextCard++;

        return c;
    }

    public String dealAHand(int handSize)
    {
        int i;
        String hand="";
        for(i=0;i==handSize;i++)
        {
            hand+="" + dealACard();
        }
        return hand;
    }
}

DeckDriver类

public class DeckDriver
{
    public static void main(String[]args)
    {
        Deck d = new Deck();
        System.out.print(d.toString()); //(this is the DeckDriver.main(DeckDriver.java:25))
    }
}

4 个答案:

答案 0 :(得分:1)

默认构造函数中没有向对象添加对象。您应该像在其他构造函数中一样初始化数组的每个字段。

答案 1 :(得分:1)

这些行

for(iCount=0; iCount<52; iCount++)
{
    Card c = new Card(iCount);
}

没有太大作用。您没有将新的Card对象存储在任何位置,因此它将被垃圾收集过程丢弃。他们应该说些什么。

for(iCount=0; iCount<52; iCount++)
{
    deck[iCount] = new Card(iCount);
}

答案 2 :(得分:0)

防止NPE的最佳方法是使用Apache Commons Lang StringUtils。

在这种情况下,它看起来像StringUtils.defaultString(deck [iCount])。 如果它为null,则defaultString将返回“”(空字符串)。

http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#defaultString%28java.lang.String%29

如果您决定不使用StringUtils,最佳做法是在执行.toString()之前始终检查null。

答案 3 :(得分:0)

您正在初始化数组,但在构造函数中为其分配新的Card

public Deck()
{
    nextCard = 0;
    deck = new Card[52];
    int iCount;
    for(iCount=0; iCount<52; iCount++)
    {
        Card c = new Card(iCount);
    }
}

您实例化每张卡片......然后扔掉它。这意味着deck数组中的每个元素都是null,因为这是默认值。