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

jab*_*dek 1 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();       
    }
}
Run Code Online (Sandbox Code Playgroud)


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

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

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

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

Gho*_*ica 10

非常简单:

public Cards [] deck = new Cards[AC];
Run Code Online (Sandbox Code Playgroud)

为Card对象创建一个带有AC插槽数的数组.

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

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

您编写的代码似乎只需要一张卡片与卡片组相同- 通过将卡片阵列添加到您的卡片类中!这使得它实际上很难解决当前的代码.解决这个问题的"常规"方法是添加类似的构造函数

public Cards() {
  deck = new Cards[AC];
  for (int i=0; i<deck.length;i++) {
    deck[i] = new Cards();
}
Run Code Online (Sandbox Code Playgroud)

如果你尝试了......你会立即遇到无休止的递归(创建一个新的卡会导致创建AC新卡(填充数组);很快就会导致堆栈溢出.

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

public class Card {
  ... a class that represents a SINGLE card in your game
Run Code Online (Sandbox Code Playgroud)

然后

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

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