我正在编写一段代码,我正在处理一副卡片。套牌中的每张卡片都是具有等级和套装的卡片类,两者都是枚举类型。我有一个Deck类,它包含一个Card对象列表。在这个甲板类中,我有一种方法可以将卡片添加到卡片的顶部(第一个可用的索引)。
我的套牌是这样初始化的。
/** Adds card to the top of this deck. */
public void add(Card card) {
for(int i = 0; i < 52; i++){
if(cards[i].equals(card)){
cards[i] = card;
break;
}
}
}
然后我按照以下方法添加卡片。
if(cards[i].equals(card)){
我在行
上得到NullPointerException{{1}}
这个想法是检查列表中的每个索引以找到第一个非空索引,但是已经遇到了NullPointerException。如何进行此运行以便在Card对象列表中找到第一个可用索引?
答案 0 :(得分:1)
首先执行空检查,然后继续:
if(cards[i]!=null && cards[i].equals(card)){
cards[i] = card;
break;
}
您可能面临的另一个问题是
cards[i]
未找到,因为卡的范围仅限于甲板的构造函数
所以请试试这个
Card[] cards;
public Deck() {
cards = new Card[52];
}
答案 1 :(得分:0)
正如neeraj所说,它将消除异常并让你顺利运行,但问题似乎是类型卡的参数。检查是否已将其初始化为null并且在调用方法之前无法分配它:
答案 2 :(得分:0)
您刚刚在构造函数中创建了一个数组,其中包含对类Card对象的52个引用。但是,您尚未初始化/创建任何这些Card对象,因此所有这些引用都为空。这就是当您尝试在null
对象上调用方法时获得NullPOinterException的原因。您应该初始化所有卡对象,如下所示:
public Deck() {
Card[] cards = new Card[52];
for(int i=0; i<52; i++) {
cards[i] = new Card(); //use your constructor with suit and rank
}
}
此外 - 如果您认为任何对象(如此处的Card)在运行时可以为null,则应该正确处理该空方案,例如在调用该对象上的方法之前检查它是否为null(正如其他人指出的那样) )。
答案 3 :(得分:0)
来自Neeraj Jain和V_Singh的答案是正确的。但请记住,如果您执行以下操作
...
if(cards[i].equals(card)){
cards[i] = card;
然后你会检查这张卡已经在这张卡片里了。如果您有52张卡(每张卡两次),您应该注意每张卡都有自己的实例。否则它只会重新分配现有的卡片。