空指针异常错误,没有明显的代码错误

时间:2015-11-18 04:10:38

标签: java nullpointerexception

我在这里有一个错误,我不知道它来自哪里。我在初学者的java课程是高中,所以我在这里还没有太多的经验。我有3个相互合并的程序。 我有一个创建扑克牌的卡片类

    //********************************************************************
//  Card.java       Author: Lewis and Loftus
//
//  Solution to Programming Project 4.5
//********************************************************************

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 faceName + " of " + suitName;
   }
}

我有一张Deck Of cards文件可以创建52张卡

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;

        Random 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());

    }
}

他们都没有错误。但是当我运行驱动程序时,我得到了输出

Exception in thread "main" java.lang.NullPointerException
    at DeckOfCards.shuffleCards(DeckOfCards.java:39)
    at DeckTester.main(DeckTester.java:8)

我试过在交易方法中改变Null无济于事。

2 个答案:

答案 0 :(得分:6)

看起来你在构造函数中声明了一个本地Random对象。

尝试将第25行更改为:

 rand = new Random();

答案 1 :(得分:1)

行Random rand = new Random();在构造函数中创建一个本地对象rand,其范围仅限于构造函数。您有两种方法可以解决此问题: -

1)将构造函数中的行更改为

Random rand = new Random();   --->  this.rand = new Random()

2)仅在声明时初始化您的实例对象。更改行

private Random rand;   ---> private Random rand = new Random();