nullpointerexception运行错误

时间:2014-04-07 01:59:44

标签: java nullpointerexception

我正在写一个java视频扑克游戏。当我运行测试文件时,我得到nullpointexception错误。它指向我的改组方法中的这一行theDeck[i] = theDeck[j];我还是java的新手...

import java.util.Random;
public class Deck {

private Card[] theDeck; 
private int top; 
// add more instance variables if needed

public Deck(){
    top = 0;
    Card[] theDeck = new Card[52];
    for(int s = 1; s <= 4; s++)
    {
        for (int v = 1; v <= 13; v++)
        {
            for (int i = 0; i < theDeck.length; i++)
            {

                theDeck[i] = new Card(s,v);
            }
        }
    }   
}

public void shuffle()
{
    // shuffle the deck here
    Random generator = new Random();
    int i;
    int j;
    i = generator.nextInt(51) + 1;
    j = generator.nextInt(51) + 1;
    Card temp = theDeck[i];
    for(int k = 1; k <100; k++)
    {
        theDeck[i] = theDeck[j];
        theDeck[j] = temp;
    }
    top = 0;
}

这是调用shuffle方法的类的一部分:

public void play()
{
    cards.shuffle();
    for( int i =1; i <= 5; i++)
    {
        p.addCard(cards.deal());
        cards.incrementTop();
    }
    for( int j = 1; j < 5; j++)
    {
        p.getHand().get(j).toString();
    }   
    System.out.println("These are your cards:");
    for( Card c : p.getHand())
    {

2 个答案:

答案 0 :(得分:0)

您在构造函数中引用了错误的theDeck数组。

在你的构造函数中,

private Card[] theDeck; // Your constructor is not referring to this!
private int top; 
// add more instance variables if needed    

public Deck(){
        top = 0;
        Card[] theDeck = new Card[52]; // You defined a local theDeck variable!
        for(int s = 1; s <= 4; s++)
        {
            for (int v = 1; v <= 13; v++)
            {
                for (int i = 0; i < theDeck.length; i++)
                {

                    theDeck[i] = new Card(s,v);
                }
            }
        }   
    }

看看那里发生了什么?因此,您创建了另一个,而不是指向类字段theDeck的构造函数。所以你应该做的就是从那一行中删除Card[],以便你的构造函数指向该字段,而不是创建一个局部变量。

这有意义吗?发表评论,以便我可以进一步帮助你。

我还建议您使用this关键字来引用您的字段。这有助于避免混淆。有关this关键字的更多信息,请参阅此link

答案 1 :(得分:0)

Card[] theDeck = new Card[52];更改为theDeck = new Card[52]; 您已经在类中声明了theDeck,在构造函数中再次声明它会将theDeck的范围缩小到构造函数中。还有,循环 for(int k = 1; k <100; k++) { theDeck[i] = theDeck[j]; theDeck[j] = temp; }

似乎没有对索引k做任何事情。

Collections API中已经有一个shuffle方法。

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html