我刚开始学习课程所需的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;价值观(二,三,一直到杰克,女王,国王,王牌)。
答案 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的合理原因。