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