我该如何解决这个空指针异常错误(Java)?

时间:2013-11-23 01:13:17

标签: java oop inheritance java.util.scanner superclass

我正在基于健身系统在bluej上创建一个项目。项目中有一个名为“Card”的父类,这个父类的子类包括忠诚度,标准和员工,这是健身系统可以容纳的所有类型的卡。系统还有一些区域,例如池,桑拿等。还有一个站点管理员班,其中包含所有健身房信息,例如有多少门以及区域的详细信息。

在运行名为centreIO的IO类时,尝试运行这部分代码;

 private void addCard()
    {
        System.out.println("Enter card id:");
        int id = reader.nextInt();
        Card cr = hatfield.getCard(id);
        hatfield.addCard(cr);


        }

我遇到了一个问题,该问题指向了zone类中的方法。这是null异常指向

的方法
public void addCardtoZone(Card C)

{

    cards.put(C.getId(),C);

}

站点管理器有两个带区域和门的Hashmaps,Zones有一个当前在区域内的所有卡的哈希映射,所以它将保存方法,例如说明区域中当前有多少卡等。我该如何解决这个问题代码,以便它实际上将卡添加到网站?我不明白为什么这不起作用,因为当我在Zone类中运行该方法时,它运行得很好。

这是我在IO类中调用的方法

public void addCard(Card cd)
{

    Outside.addCardtoZone(cd);

}

编辑:put方法将一个键和一个对象放入hashmap

private HashMap cards = new HashMap<Integer,Card>();

以下是卡片类的一个示例(其他3个类的超类,忠诚度,标准,员工。)

public class Card
{
public String name;

public int rating;
public int credits;
public String centre;
public int type;

//Public constructor
public Card(String nam, int rat, int cred)
{

    name = nam;
    rating = rat;
    credits = cred;


}

public int getId() //getId() has been overridden in the child classes
{

    return 0;

}

public String getName()
{
    return name;
}  

/** returns member's rating
 * @return member's rating
 */
public int getRating()
{
    return rating;
}

/** changes a member's rating
 * @param rat new rating 
 */
public void changeRating(int rat)
{
    rating = rat;
}



}

}

2 个答案:

答案 0 :(得分:0)

public void addCardToZone(Card C) {
    if(cards == null) {
        cards = new HashMap<Integer, Card>();
    }
    cards.put(C.getId(),C);
}

现在,您的addCardToZone方法会检查cards null。如果它是null,它将初始化它。在此之后,您只需正常put张卡片。 if只应在第一次拨打addCardToZone时输入。

答案 1 :(得分:0)

而不是告诉你解决方案是什么(这有点困难,因为我们无法看到所有可能相关的源代码......),这里是如何诊断它。

  

1)使用stacktrace来识别抛出NPE的代码行。

您已将其识别为:

  cards.put(C.getId(),C);
  

2)找出可能导致NPE的原因。

在这种情况下,只有两个可能的原因:

  • 如果cardsnull,则cards.put将投放NPE。
  • 如果cnull,则c.getId()将投放NPE。
  

3)在上下文中消除逻辑上不可能的案例。

例如,如果cards被声明为final并且您已将其初始化为非空值,那么您可以消除可能的原因。或者,如果在之前的语句中,您可以使用c变量,如果它是null,则可能会失败,您可以消除它。

  

4)通过代码向后工作重复3)......

     

5)如果失败,可以使用调试器或明智的日志记录/跟踪打印来消除可能的原因或确认怀疑。