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