【问题标题】:Java simple BlackJack, java.lang.NullPointerExceptionJava 简单的二十一点,java.lang.NullPointerException
【发布时间】:2013-10-07 02:25:50
【问题描述】:

编辑:我的第一个问题已经解决,但是,函数 getValue() 总是返回 11。有什么想法吗?

编辑:找到了,

Collections.shuffle(Arrays.asList(deck));

没有正确洗牌。我不知道为什么。

我正在做一个作业,我必须编写/填写一些代码来编写一个简单的二十一点程序。

我已经定义了三个类,一个 Card 类,一个 Hand 类(它是 Cards 和一些其他值的数组)和 Deck 类,它也是 Cards 数组。

在 Hand 类中,我有一个方法可以将卡片的所有值相加,每当我运行我的代码时,我都会得到一个 java.lang.NullPointerException,控制台指向我的这个“addHand”方法:

public int addHand(){
   int j=0;
   for(int i=0; i<=counter-1; i++){
      j += Cards[i].getValue();
   }

   return j;

}

我认为这是因为 Cards[] 中的某些值是空的。但是“计数器”不应该让它们中的任何一个被添加。我将包括手牌类的其余部分,以及卡片类。

手类:

public class Hand {

private Card[] Cards;
private int counter;
//private int valueOfHand;

public Hand(){
    Cards = new Card[10];
    counter = 0;

}

public int numCards(){
   return counter;
}

public Card getCard(int i){
   return Cards[i];
}

public int getCounter() {
   return counter;
}

public void setCounter(int counter) {
   this.counter = counter;
}

public void addCard(Card card){
   Cards[counter] = card;
   setCounter(counter+1);
}

public int addHand(){
    int j=0;
    for(int i=0; i<=counter-1; i++){
      j += Cards[i].getValue();
   }

   return j;

}



}

还有卡片类:

public class Card {

private String value;
private String suit;

public Card(String number, String shape){
    value = number;
    suit = shape;

}
public int getValue() {
    if (value.equals("King") || value.equals("Queen") || value.equals("Jack")){
        return 10;
    }
    else if (value.equals("Ace")){
        return 11;
    }
    else {
        return Integer.parseInt(value);
    }


}
public void setValue(String value) {
    this.value = value;
}
public String getSuit() {
    return suit;
}
public void setSuit(String suit) {
    this.suit = suit;
}
}

我不知道我是否需要发布其他任何内容,如果有必要我会很乐意。

确切的错误是:

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
at Hand.addHand(Hand.java:39)
at BlackJackGUIPanel$CardPanel.hitMe(BlackJackGUIPanel.java:182)
at BlackJackGUIPanel$CardPanel.actionPerformed(BlackJackGUIPanel.java:161)

这是 Hitme 代码:

void hitMe() {
     if (!gameInProgress) {
        message = "Click \"New Game\" to start a new game!";
        repaint();
        return;
     }


     player.addCard(deck.giveCard());
     if(player.addHand() > 21){
         message = "Game over, you busted";
         gameInProgress = false;
     }


 message = "You clicked Hit Me!";
     repaint();

以及 giveCard() 代码:

public Card giveCard(){
    Card temp = Decks[0];
    for(int i = 1; i<52; i++){
        Decks[i-1] = Decks[i];
    }
    Decks[51] = temp;
    return temp;

}

我找不到更好的方法来完成这部分。 这里是我初始化我的牌组的地方:

public Deck(){
    Decks = new Card[52];


    //int cardNumber = 2;
    for(int i = 0; i < 52; i += 4){
        switch (i/4){
        case 0: Decks[i] = new Card("2", "Spades");
                Decks[i+1] =  new Card("2", "Hearts");
                Decks[i+2] = new Card("2", "Clubs");
                Decks[i+3] = new Card("2", "Diamonds");

        case 4: Decks[i] = new Card("3", "Spades");
                Decks[i+1] =  new Card("3", "Hearts");
                Decks[i+2] = new Card("3", "Clubs");
                Decks[i+3] = new Card("3", "Diamonds");

        case 8: Decks[i] = new Card("4", "Spades");
                Decks[i+1] =  new Card("4", "Hearts");
                Decks[i+2] = new Card("4", "Clubs");
                Decks[i+3] = new Card("4", "Diamonds");

        case 12: Decks[i] = new Card("5", "Spades");
                Decks[i+1] =  new Card("5", "Hearts");
                Decks[i+2] = new Card("5", "Clubs");
                Decks[i+3] = new Card("5", "Diamonds");

        case 16: Decks[i] = new Card("6", "Spades");
                Decks[i+1] =  new Card("6", "Hearts");
                Decks[i+2] = new Card("6", "Clubs");
                Decks[i+3] = new Card("6", "Diamonds");

        case 20: Decks[i] = new Card("7", "Spades");
                Decks[i+1] =  new Card("7", "Hearts");
                Decks[i+2] = new Card("7", "Clubs");
                Decks[i+3] = new Card("7", "Diamonds");

        case 24: Decks[i] = new Card("8", "Spades");
                Decks[i+1] =  new Card("8", "Hearts");
                Decks[i+2] = new Card("8", "Clubs");
                Decks[i+3] = new Card("8", "Diamonds");

        case 28: Decks[i] = new Card("9", "Spades");
                Decks[i+1] =  new Card("9", "Hearts");
                Decks[i+2] = new Card("9", "Clubs");
                Decks[i+3] = new Card("9", "Diamonds");

        case 32: Decks[i] = new Card("10", "Spades");
                Decks[i+1] =  new Card("10", "Hearts");
                Decks[i+2] = new Card("10", "Clubs");
                Decks[i+3] = new Card("10", "Diamonds");

        case 36: Decks[i] = new Card("Jack", "Spades");
                Decks[i+1] =  new Card("Jack", "Hearts");
                Decks[i+2] = new Card("Jack", "Clubs");
                Decks[i+3] = new Card("Jack", "Diamonds");

        case 40: Decks[i] = new Card("Queen", "Spades");
                Decks[i+1] =  new Card("Queen", "Hearts");
                Decks[i+2] = new Card("Queen", "Clubs");
                Decks[i+3] = new Card("Queen", "Diamonds");

        case 44: Decks[i] = new Card("King", "Spades");
                Decks[i+1] =  new Card("King", "Hearts");
                Decks[i+2] = new Card("King", "Clubs");
                Decks[i+3] = new Card("King", "Diamonds");

        case 48: Decks[i] = new Card("Ace", "Spades");
                Decks[i+1] =  new Card("Ace", "Hearts");
                Decks[i+2] = new Card("Ace", "Clubs");
                Decks[i+3] = new Card("Ace", "Diamonds");
        }
        }
    Collections.shuffle(Arrays.asList(Decks));
    }

【问题讨论】:

  • 这取决于你如何初始化手。可能在您的主应用程序(BlackJackGUIPanel)中,您不小心用null Card 调用了addHand
  • 你能不能只调试一下,看看你是否得到了所有 Cards[i] 值或 i 的特定值的 null
  • addCard(Card) 实际上在哪里被调用?
  • 您能否为您的.hitMe 方法添加代码以及您在何处以及如何调用addCard()

标签: java class blackjack


【解决方案1】:

作为调试,您可以这样做

public int addHand()
{
   int j=0;
   for(int i=0; i<=counter-1; i++)
   {
      Card c = Cards[i];
      if(c != null)
         j += Cards[i].getValue();
      else
         System.out.println("Add hand was trying to add a null card for index = " + i);
   }
   return j;
}

您可能还想在 addCard(Card) 方法中添加一个检查,以便无法添加空卡

public void addCard(Card card)
{
    if(card != null)
    {
        Cards[counter] = card;
        setCounter(counter+1);
    }
    else
        System.out.println("NO NO NO! Trying to add a null card to your hand");
}

【讨论】:

  • 这有帮助!然而,我得到了不可预知的结果,有时,程序会运行一次或两次,然后我得到“添加手试图为 index = 添加一个空卡”,但有时,它甚至在我得到它之前都没有运行一次。
  • 这表明您的代码中的其他地方存在问题。另请注意,这不应用作修复程序。如果允许,我建议您使用ArrayList
  • 使用第二个调试,我立即得到 else 行。但有时我不明白。
  • 这就是你的问题,查看你的代码,你将卡片添加到手上!
  • 但同样,结果是不可预测的。
【解决方案2】:

这取决于对addCard 方法的调用。此方法将 card 设置为您的 cards 变量。假设您调用了addCard 3 次,那么addHand 中循环的0、1 和2 次迭代都可以,但迭代3 将通过异常,因为cards[3]null

确保您正确添加卡片。

【讨论】:

  • i&lt;=counter-1 for 循环中的这个逻辑意味着这不会发生。
  • @JavaDevil:你怎么能这么说?
  • 如果addCard() 被调用了3 次,那么counter = 3counter-1 = 22 != 3 所以cards[3] 不会被调用。
  • @JavaDevil:你是对的。我真的没有注意到counter。我将删除我的答案,因为它不合适。
猜你喜欢
  • 1970-01-01
  • 2016-11-09
  • 2014-10-27
  • 2017-04-05
  • 2012-04-25
  • 2014-08-12
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
相关资源
最近更新 更多