Java 输出中为Null,而其他输出中没有Null

Java 输出中为Null,而其他输出中没有Null,java,Java,我在上java初学者课程。我必须制作一张卡片。然后创建一副牌和一些方法,然后进行测试 我的卡片分类如下 import java.util.*; public class Card { public final static int ACE = 1; public final static int TWO = 2; public final static int THREE = 3; public final static int FOUR = 4; pu

我在上java初学者课程。我必须制作一张卡片。然后创建一副牌和一些方法,然后进行测试

我的卡片分类如下

import java.util.*;

public class Card
{
   public final static int ACE   = 1;
   public final static int TWO   = 2;
   public final static int THREE = 3;
   public final static int FOUR  = 4;
   public final static int FIVE  = 5;
   public final static int SIX   = 6;
   public final static int SEVEN = 7;
   public final static int EIGHT = 8;
   public final static int NINE  = 9;
   public final static int TEN   = 10;
   public final static int JACK  = 11;
   public final static int QUEEN = 12;
   public final static int KING  = 13;

   public final static int CLUBS    = 1;
   public final static int DIAMONDS = 2;
   public final static int HEARTS   = 3;
   public final static int SPADES   = 4;

   private final static int NUM_FACES = 13;
   private final static int NUM_SUITS = 4;

   private int face, suit;
   private String faceName, suitName;

   private int myInt1, myInt2;

   Random rand = new Random();

   //-----------------------------------------------------------------
   //  Creates a random card.
   //-----------------------------------------------------------------
   public Card ()
   {
      face = rand.nextInt(4) + 1;
      setFaceName();

      suit = rand.nextInt(13) + 1;
      setSuitName();
   }



   //-----------------------------------------------------------------
   //  Sets the string representation of the face using its stored
   //  numeric value.
   //-----------------------------------------------------------------
   private void setFaceName()
   {
      switch (face)
      {
         case 1:
            faceName = "Ace";
            break;
         case 2:
            faceName = "Two";
            break;
         case 3:
            faceName = "Three";
            break;
         case 4:
            faceName = "Four";
            break;
         case 5:
            faceName = "Five";
            break;
         case 6:
            faceName = "Six";
            break;
         case 7:
            faceName = "Seven";
            break;
         case 8:
            faceName = "Eight";
            break;
         case 9:
            faceName = "Nine";
            break;
         case 10:
            faceName = "Ten";
            break;
         case 11:
            faceName = "Jack";
            break;
         case 12:
            faceName = "Queen";
            break;
         case 13:
            faceName = "King";
            break;
      }
   }

   //-----------------------------------------------------------------
   //  Sets the string representation of the suit using its stored
   //  numeric value.
   //-----------------------------------------------------------------
   private void setSuitName()
   {
      switch (suit)
      {
         case 1:
            suitName = "Clubs";
            break;
         case 2:
            suitName = "Diamonds";
            break;
         case 3:
            suitName = "Hearts";
            break;
         case 4:
            suitName = "Spades";
            break;
      }
   }

   //-----------------------------------------------------------------
   //  Determines if this card is higher than the passed card. The
   //  second parameter determines if aces should be considered high
   //  (beats a King) or low (lowest of all faces).  Uses the suit
   //  if both cards have the same face.
   //-----------------------------------------------------------------
   public boolean isHigherThan (Card card2, boolean aceHigh)
   {
      boolean result = false;

      if (face == card2.getFace())
      {
         if (suit > card2.getSuit())
            result = true;
      }
      else
      {
         if (aceHigh && face == ACE)
            result = true;
         else
            if (face > card2.getFace())
               result = true;
      }

      return result;
   }

   //-----------------------------------------------------------------
   //  Determines if this card is higher than the passed card,
   //  assuming that aces should be considered high.
   //-----------------------------------------------------------------
   public boolean isHigherThan (Card card2)
   {
      return isHigherThan (card2, true);
   }

   //-----------------------------------------------------------------
   //  Returns the face (numeric value) of this card.
   //-----------------------------------------------------------------
   public int getFace ()
   {
      return face;
   }

   //-----------------------------------------------------------------
   //  Returns the suit (numeric value) of this card.
   //-----------------------------------------------------------------
   public int getSuit ()
   {
      return suit;
   }

   //-----------------------------------------------------------------
   //  Returns the face (string value) of this card.
   //-----------------------------------------------------------------
   public String getFaceName ()
   {
      return faceName;
   }

   //-----------------------------------------------------------------
   //  Returns the suit (string value) of this card.
   //-----------------------------------------------------------------
   public String getSuitName ()
   {
      return suitName;
   }

   //-----------------------------------------------------------------
   //  Returns the string representation of this card, including
   //  both face and suit.
   //-----------------------------------------------------------------



   public String toString ()
   {
      return getFaceName() + " of " + getSuitName();
   }
}
import java.util.*;


public class DeckOfCards 
{

    private Card deckOfCards[];
    private int currentCardUsed;
    private final int NumberOfCards = 52;

    private int nextCard;

    private Random rand;

    String myString = "All Cards have been dealt.";




    public DeckOfCards()
    {
        deckOfCards = new Card[NumberOfCards];
        currentCardUsed = 0;

        rand = new Random();

        for(int index = 0; index < deckOfCards.length; index ++)
        {
            deckOfCards[index] = new Card();
        }
    }

    public void shuffleCards()
    {
            currentCardUsed = 0;

            for(int newCard = 0; newCard < deckOfCards.length; newCard ++)
            {
                int nextCard = rand.nextInt(NumberOfCards);

                Card temporaryDeck = deckOfCards[newCard];
                deckOfCards[newCard] = deckOfCards[nextCard];
                deckOfCards[nextCard] = temporaryDeck;
            }
    }

    public Card dealCard()
    {
        if(currentCardUsed < deckOfCards.length)
        {
            return deckOfCards[currentCardUsed ++];
        }
        else
        {
            return null;
        }
    }
}
public class DeckTester 
{
    public static void main(String [] args)
    {
        DeckOfCards deck = new DeckOfCards();

        deck.shuffleCards();

        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());

        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());



    }
}
我的一副牌的种类如下

import java.util.*;

public class Card
{
   public final static int ACE   = 1;
   public final static int TWO   = 2;
   public final static int THREE = 3;
   public final static int FOUR  = 4;
   public final static int FIVE  = 5;
   public final static int SIX   = 6;
   public final static int SEVEN = 7;
   public final static int EIGHT = 8;
   public final static int NINE  = 9;
   public final static int TEN   = 10;
   public final static int JACK  = 11;
   public final static int QUEEN = 12;
   public final static int KING  = 13;

   public final static int CLUBS    = 1;
   public final static int DIAMONDS = 2;
   public final static int HEARTS   = 3;
   public final static int SPADES   = 4;

   private final static int NUM_FACES = 13;
   private final static int NUM_SUITS = 4;

   private int face, suit;
   private String faceName, suitName;

   private int myInt1, myInt2;

   Random rand = new Random();

   //-----------------------------------------------------------------
   //  Creates a random card.
   //-----------------------------------------------------------------
   public Card ()
   {
      face = rand.nextInt(4) + 1;
      setFaceName();

      suit = rand.nextInt(13) + 1;
      setSuitName();
   }



   //-----------------------------------------------------------------
   //  Sets the string representation of the face using its stored
   //  numeric value.
   //-----------------------------------------------------------------
   private void setFaceName()
   {
      switch (face)
      {
         case 1:
            faceName = "Ace";
            break;
         case 2:
            faceName = "Two";
            break;
         case 3:
            faceName = "Three";
            break;
         case 4:
            faceName = "Four";
            break;
         case 5:
            faceName = "Five";
            break;
         case 6:
            faceName = "Six";
            break;
         case 7:
            faceName = "Seven";
            break;
         case 8:
            faceName = "Eight";
            break;
         case 9:
            faceName = "Nine";
            break;
         case 10:
            faceName = "Ten";
            break;
         case 11:
            faceName = "Jack";
            break;
         case 12:
            faceName = "Queen";
            break;
         case 13:
            faceName = "King";
            break;
      }
   }

   //-----------------------------------------------------------------
   //  Sets the string representation of the suit using its stored
   //  numeric value.
   //-----------------------------------------------------------------
   private void setSuitName()
   {
      switch (suit)
      {
         case 1:
            suitName = "Clubs";
            break;
         case 2:
            suitName = "Diamonds";
            break;
         case 3:
            suitName = "Hearts";
            break;
         case 4:
            suitName = "Spades";
            break;
      }
   }

   //-----------------------------------------------------------------
   //  Determines if this card is higher than the passed card. The
   //  second parameter determines if aces should be considered high
   //  (beats a King) or low (lowest of all faces).  Uses the suit
   //  if both cards have the same face.
   //-----------------------------------------------------------------
   public boolean isHigherThan (Card card2, boolean aceHigh)
   {
      boolean result = false;

      if (face == card2.getFace())
      {
         if (suit > card2.getSuit())
            result = true;
      }
      else
      {
         if (aceHigh && face == ACE)
            result = true;
         else
            if (face > card2.getFace())
               result = true;
      }

      return result;
   }

   //-----------------------------------------------------------------
   //  Determines if this card is higher than the passed card,
   //  assuming that aces should be considered high.
   //-----------------------------------------------------------------
   public boolean isHigherThan (Card card2)
   {
      return isHigherThan (card2, true);
   }

   //-----------------------------------------------------------------
   //  Returns the face (numeric value) of this card.
   //-----------------------------------------------------------------
   public int getFace ()
   {
      return face;
   }

   //-----------------------------------------------------------------
   //  Returns the suit (numeric value) of this card.
   //-----------------------------------------------------------------
   public int getSuit ()
   {
      return suit;
   }

   //-----------------------------------------------------------------
   //  Returns the face (string value) of this card.
   //-----------------------------------------------------------------
   public String getFaceName ()
   {
      return faceName;
   }

   //-----------------------------------------------------------------
   //  Returns the suit (string value) of this card.
   //-----------------------------------------------------------------
   public String getSuitName ()
   {
      return suitName;
   }

   //-----------------------------------------------------------------
   //  Returns the string representation of this card, including
   //  both face and suit.
   //-----------------------------------------------------------------



   public String toString ()
   {
      return getFaceName() + " of " + getSuitName();
   }
}
import java.util.*;


public class DeckOfCards 
{

    private Card deckOfCards[];
    private int currentCardUsed;
    private final int NumberOfCards = 52;

    private int nextCard;

    private Random rand;

    String myString = "All Cards have been dealt.";




    public DeckOfCards()
    {
        deckOfCards = new Card[NumberOfCards];
        currentCardUsed = 0;

        rand = new Random();

        for(int index = 0; index < deckOfCards.length; index ++)
        {
            deckOfCards[index] = new Card();
        }
    }

    public void shuffleCards()
    {
            currentCardUsed = 0;

            for(int newCard = 0; newCard < deckOfCards.length; newCard ++)
            {
                int nextCard = rand.nextInt(NumberOfCards);

                Card temporaryDeck = deckOfCards[newCard];
                deckOfCards[newCard] = deckOfCards[nextCard];
                deckOfCards[nextCard] = temporaryDeck;
            }
    }

    public Card dealCard()
    {
        if(currentCardUsed < deckOfCards.length)
        {
            return deckOfCards[currentCardUsed ++];
        }
        else
        {
            return null;
        }
    }
}
public class DeckTester 
{
    public static void main(String [] args)
    {
        DeckOfCards deck = new DeckOfCards();

        deck.shuffleCards();

        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());

        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());
        System.out.println(deck.dealCard());



    }
}
输出:

Two of null
Ace of Hearts
Two of null
Four of null
Ace of null
Ace of Spades
Two of Diamonds
Ace of Clubs
Ace of null
对于为什么不是所有卡都有值的任何帮助,我们将不胜感激,

简单错误:

改变

   public Card ()
   {
      face = rand.nextInt(4) + 1;
      setFaceName();

      suit = rand.nextInt(13) + 1;
      setSuitName();
   }

其他建议:

  • 使用枚举,而不是神奇的数字,你就不会有这样的混乱
  • 不要创建随机牌,创建一个完整的牌组并洗牌

    • 共有13张脸和4套衣服(您甚至定义了常数)。所以

      应该是

      face = rand.nextInt(13) + 1;
      // ...
      suit = rand.nextInt(4) + 1;
      
      使用先前定义的
      常量,如

      face = rand.nextInt(Card.NUM_FACES) + 1;
      // ...
      suit = rand.nextInt(Card.NUM_SUITS) + 1;
      

      使用以下代码更新卡构造函数

      public Card() {
              Random r = new Random();
              int Low = 1;
              int High = 13;
              face = r.nextInt(High - Low) + Low;
              setFaceName();
      
              Random r2 = new Random();
              int Low2 = 1;
              int High2 = 4;
              suit = r2.nextInt(High2 - Low2) + Low2;
              setSuitName();
          }
      

      这不是问题,但是您可以通过为faces和Suites创建一个类级字符串数组,然后执行类似于
      private void setFaceName(){faceName=faces[face-1];}
      的操作,使代码更干净。我更改了代码段,但现在所有输出都为空,而不仅仅是一些。我修复了它。谢谢大家的帮助