Java 写一个21点程序,当我试图打印出洗过的牌组时得到了nullpointerEx

Java 写一个21点程序,当我试图打印出洗过的牌组时得到了nullpointerEx,java,arrays,nullpointerexception,tostring,blackjack,Java,Arrays,Nullpointerexception,Tostring,Blackjack,基本上,我试着在测试程序中运行deckTest,以打印出洗牌后的deckTest,并删除deckTest上的第一条和最后一条注释。我得到的只是行answer=answer+\n+deck[I]上的nullpointerEx;在Deck类中的toString方法中 但当我试图在testDeck中打印出带有评论的预洗牌Deck时,这很好 从deckTest中的第二个注释实际上显示了洗牌牌组的第一张牌这一事实来看,我认为洗牌至少是有效的 谢谢你们,祝你们2015年快乐! 威廉S 有一个测试程序: pu

基本上,我试着在测试程序中运行deckTest,以打印出洗牌后的deckTest,并删除deckTest上的第一条和最后一条注释。我得到的只是行answer=answer+\n+deck[I]上的nullpointerEx;在Deck类中的toString方法中

但当我试图在testDeck中打印出带有评论的预洗牌Deck时,这很好

从deckTest中的第二个注释实际上显示了洗牌牌组的第一张牌这一事实来看,我认为洗牌至少是有效的

谢谢你们,祝你们2015年快乐! 威廉S

有一个测试程序:

public class TestCard
{



    public static void main ()
    {
        Card c1=new Card(0,1);
        Card c2=new Card(3,13);
        System.out.println(c1.toString());
        System.out.println(c2.toString());

    }
    public static void deckTest()
    {
        Deck d1= new Deck();
        System.out.println(d1);

        //d1.shuffle();
        //System.out.println(d1.dealCard().toString());
        //System.out.println(d1.toString());

    }
}
这是指甲板等级:

import java.util.Random;// for shuffing the cards


public class Deck
{


    private final int NUMOFCARDS= 52;
    private int numCards;

    private Card[] deck= new Card[53];

    /**
     * Constructor for objects of class deck
     */
    public Deck()
    {
        int c = 0;
        for (int s=0;s<=3;s++)
        {
            for (int n=1;n<=13;n++){

                deck[c]=new Card(s,n);
                c++;    
            }
        }
        numCards=NUMOFCARDS;
    }

    /**
     * Use this method to display all of the cards in the deck
     */
    public String toString()
    {
        String answer = "";

        for (int i=0;i<53;i++)
        {

            answer= answer + "\n" + deck[i].toString();
        }



        return answer;

    }

    /**
     * returns true of the current number of cards in the deck equals to 0
     */
    public boolean empty()
    {
        return numCards==0;
    }

    /**
     * pull the bottem card from the deck
     * the variable 
     */
    public Card dealCard()
    {
        if (empty())
        {
            System.out.println("the deck has run out of cards, there will be a new,preshufffled deck to continue");
            //shuffle();  //shuffle cards
            numCards=NUMOFCARDS; //reset dealPosition for dealing new deck            
        }

        numCards--;
        return deck[52-numCards];        
    }

    public void shuffle()
    {
        Random random = new Random(); // creat a random object

        Card memory;
        int randomPosition ;
        for (int i=0;i<53;i++)
        {
            randomPosition = random.nextInt(53); // assign a number between 0 to 52 as randomPosition for shuffle
            memory=deck[i];   // store the current deck[i] card 
            deck[i]=deck[randomPosition];    //assign new card to current card 
            deck[randomPosition]=memory;    //assign current card to new card 
        }

    }
}
public class Card
{
    final int JACK = 11;
    final int QUEEN = 12;
    final int KING = 13;
    final int ACE = 1;



    private int num;
    private int suit;
    final int SPADES = 0;
    final int HEARTS = 1;
    final int DIAMONDS = 2;
    final int CLUBS = 3;




    public Card(int theSuit,int theNum)
    {
        num=theNum;
        suit=theSuit;
    }

    public String showSuit()
    {
        if (suit==0)
        {
            return "Spades";
        }
        if (suit==1)
        {
            return "Hearts";
        }
        if (suit==2)
        {
            return "Diamonds";
                    }
        if (suit==3)
        {
            return "Clubs";
        }
        return "";
    }

    public String showNum()
    {
        if (num==11)
        {
            return "Jack";
        }
        if (num==12)
        {
            return "Queen";
        }
        if (num==13)
        {
            return "King";
        }
        if (num==1)
        {
            return "Ace";
        }

        return ""+num;
    }


    public String toString()
    {
        return " "+ showNum() + " of " + showSuit();
    }



    public boolean equals(Card theCard)
    {
       return theCard.toString().equals(toString());
    }
线路

answer=answer+ "\n" + deck[i].toString();
如果甲板[i]尚未初始化,将抛出NullPointerException。当使用隐式参数null调用toString时,会引发这样的异常

确保在此行之前初始化了deck[i]

查看您的代码,您似乎没有初始化索引52处的卡。

更改:

/**
 * Use this method to display all of the cards in the deck
 */
public String toString()
{
    String answer = "";

    for (int i=0;i<53;i++)
    {

        answer= answer + "\n" + deck[i].toString();
    }



    return answer;

}
为此:

/**
 * Use this method to display all of the cards in the deck
 */
public String toString()
{
    String answer = "";

    for (int i=0;i<52;i++)
    {

        answer= answer + "\n" + deck[i].toString();
    }



    return answer;

}

正如前面的海报所述,您将得到一个空指针异常,因为您在牌组中只初始化了0-51,但正在使用您拥有的逻辑打印0-52。

问题是您正在通过牌组的最后一张牌。 你的牌组构造器上有:4*13=52张牌。因此,您的阵列将在位置0、1、…、51上有卡。但是在toString方法中,您迭代到第52个索引中的元素,该索引不存在

将您的方法更改为字符串:

@Override
public String toString() {
    String answer = "";
    for (int i = 0; i < numCards; i++) {
        answer = answer + "\n" + deck[i].toString();
    }
    return answer;
}
看看dealCard方法从牌组中移除一张牌。将迭代次数固定为52可能会在移除更多卡时导致NullPointerException,因此最好使用numCards

此外,出于同样的原因,您的方法shuffle也将遭受NullPointerException的影响。将该方法更改为:

public void shuffle() {
    final Random random = new Random(); // creat a random object

    Card memory;
    int randomPosition;
    for (int i = 0; i < numCards; i++) {
        randomPosition = random.nextInt(numCards); // assign a number
                                                    // between 0 to
                                                    // 52 as randomPosition
                                                    // for
                                                    // shuffle
        memory = deck[i]; // store the current deck[i] card
        deck[i] = deck[randomPosition]; // assign new card to current card
        deck[randomPosition] = memory; // assign current card to new card
    }

}

为什么Deck.Deck 53元素很长?@immibis可能删除了小丑,但没有删除抽签和扑克规则?我这样问是因为,由于您只初始化了52个元素,其中一个元素为空。而且你的toString不能处理null。谢谢你的帮助!感谢您的评论我相信我确实在构造函数组中初始化了组[I]。我做了两个for循环来初始化卡片组中的卡片,并为它们指定了suit+编号。你可以通过在该行之前打印出卡片组[I]来确定。看看你的代码,当你洗牌的时候,如果你把一张牌换成一张在牌组后面索引的牌,你的牌的位置就会被设置为空。这就是为什么甲板[i]会变成空的。但是你应该逐行检查这段代码,看看到底什么/哪里被设置为null。BlueJ有一个内置的停止函数,所以我会试试看是否有一个deck[I]为null,谢谢你的建议!好的,我会尝试将你的卡片组大小设置为52,看看这个错误是否消失。您可能会导致另一个错误,因为您使其他函数依赖于硬编码的数据组大小,所以为什么不创建一个最终变量deck_size=52并重构该代码以显示deck_size或deck_size-1,而不是53或52。实际上,我将其称为numocards,但在创建之后完全忘记使用它。我想Willian的回复也提到了这一点。我将确保我在未来使用更多的常量!我注意到我的逻辑没有任何意义,谢谢你指出这一点!我最近刚学会了阵列,所以有时还是很难掌握。谢谢你的建议!下次编码的时候,我会更加防御性!祝2015年一切顺利,祝2015年一切顺利!如果有任何答案可以解决您的问题,请记住接受这些答案: