麻烦NullPointerException

时间:2015-11-25 06:51:59

标签: java nullpointerexception

我正在编写一段代码,我正在处理一副卡片。套牌中的每张卡片都是具有等级和套装的卡片类,两者都是枚举类型。我有一个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对象列表中找到第一个可用索引?

4 个答案:

答案 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张卡(每张卡两次),您应该注意每张卡都有自己的实例。否则它只会重新分配现有的卡片。