我正在基于健身系统在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;
}
}
}
答案 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的原因。
在这种情况下,只有两个可能的原因:
cards
为null
,则cards.put
将投放NPE。c
为null
,则c.getId()
将投放NPE。3)在上下文中消除逻辑上不可能的案例。
例如,如果cards
被声明为final
并且您已将其初始化为非空值,那么您可以消除可能的原因。或者,如果在之前的语句中,您可以使用c
变量,如果它是null,则可能会失败,您可以消除它。
4)通过代码向后工作重复3)......
5)如果失败,可以使用调试器或明智的日志记录/跟踪打印来消除可能的原因或确认怀疑。