NullPointerException,即使经过研究也无法找到原因

时间:2016-11-07 12:51:04

标签: java arrays class

我在java中创建典型的牌/牌组时遇到了困难。我读过一些类似的问题&答案,但要么他们不相关/有帮助,要么我不能简单地理解它。 这是代码

public class Cards {
    boolean isAvailable;
    int card_id;
    static final int AC = 32;
    public Cards [] deck = new Cards[AC];

    public void set () {
        int a = 0;
        for (int i = 0; i < AC; i++) {
            if(a == 4) a = 0;
            deck[i].isAvailable = true;     // <---------
            deck[i].card_id = i + (a * 101);    // <---------
            a++;
        }   
    }
    public void read () {
        for (int i = 0; i < AC; i++) 
        System.out.println(deck[i].isAvailable + "  " + deck[i].card_id);
    }
    public static void main (String[] args) {
        Cards c = new Cards();
        c.set();
        c.read();       
    }
}
  

线程“main”中的异常java.lang.NullPointerException
  在Cards.set(Cards.java:13)
  在Cards.main(Cards.java:24)

1。 我已经阅读了类似的问题,发现问题可能在于数组的初始化,我试图用我的编程做同样的事情,但无论如何它都变坏了。

我标记了第13行和第14行因为它们被指向(当我评论第13行只是为了检查时,指针设置到下一行)。

2。 我想从你那里获得的下一部分帮助是: 即使有主要的(为了训练目的),我看到其他班级使用这个类(它只是创建甲板)所以我想我不会需要主...除了probs之外,一切都设置得好吗?

1 个答案:

答案 0 :(得分:10)

很简单:

public Cards [] deck = new Cards[AC];

为卡片对象创建一个带有AC插槽数的数组。

现在你必须将非null 卡片对象放入每个插槽中!

但事实是:实际上你的抽象被打破了。

您编写的代码似乎将一张卡与卡套相同 - 将数组卡添加到您的卡类!这使得难以 修复您当前的代码。作为&#34;正常&#34;解决这个问题的方法是添加像

这样的构造函数
public Cards() {
  deck = new Cards[AC];
  for (int i=0; i<deck.length;i++) {
    deck[i] = new Cards();
}

如果您尝试... 立即进行无休止的递归(创建一个新卡将导致创建AC新卡(填充阵列);很快导致堆栈溢出。

因此,真正的答案就是沿着这些方向:

public class Card {
  ... a class that represents a SINGLE card in your game

然后

public card GameOfCards {
  ... a class that (for example!) uses an array to hold n objects of class Card!

最后,正如Peter在评论中指出的那样:你应该学习使用调试手段来自己解决这些问题。一个好方法:在使用任何数据结构之前,迭代它并打印出它的内容。或者甚至更好,学习如何使用调试器,并逐步完成代码!你应该理解:这是非常基本的东西; 通常你不应该在这里提出来。