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))
}
}
答案 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将返回“”(空字符串)。
如果您决定不使用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
,因为这是默认值。