繁体   English   中英

如何解决此空指针异常错误(Java)?

[英]How do i resolve this null pointer exception error (Java)?

我正在基于健身系统在bluej上创建一个项目。 项目中有一个名为“ Card”的父类,该父类的子类包括Loyalty,Standard和staff,它们是Gym系统可以容纳的所有类型的卡。该系统还具有多个区域,例如游泳池,桑拿浴室等。还有一个sitemanager类,其中包含所有体育馆信息,例如,有多少扇门以及区域的详细信息。

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

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


        }

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

public void addCardtoZone(Card C)

{

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

}

站点管理器有两个带有“区域”和“门”的哈希图,“区域”具有该区域中当前所有卡的哈希图,因此它将保存诸如说明区域中当前有多少卡等方法。如何修复此代码,以便它实际上将卡添加到该网站吗? 我不明白为什么这不起作用,因为当我从Zone类中运行该方法时,它可以完美地工作。

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

public void addCard(Card cd)
{

    Outside.addCardtoZone(cd);

}

编辑:put方法将一个键和一个对象放入哈希图中

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;
}



}

}

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输入addCardToZone

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

1)使用stacktrace识别引发NPE的代码行。

您已将其标识为:

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

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

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

  • 如果cardsnullcards.put将抛出一个NPE。
  • 如果cnullc.getId()将引发NPE。

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

例如,如果将cards声明为final并且已将其初始化为非null值,则可以消除这种可能的原因。 或者,如果在上一条语句中可以以某种方式使用c变量(如果该变量为null则失败),则可以消除该变量。

4)向后遍历重复的代码3)...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM