2012-04-05 81 views
1

我正在研究一个基于文本的冒险游戏项目。它涉及房间内的物品,并从一个房间到另一个房间导航。有一个叫Item的类,这个叫做Room的大类。我所有的方法似乎除了addNeighbor(大概也是getNeighbor),我创建了一个房间,并且工作得很好,我创建了第二个房间,但是当我尝试添加一个邻居时,它崩溃并给了我一个空指针异常。我在这里做错了什么?不知道为什么我得到这个空指针异常错误

public class Room 
{ 
    private String roomDescription; 
    private Item item; 
    private HashMap <String, Room> myNeighbors; 

    public Room (String pDescription){ 
     roomDescription = pDescription; 
     item = null; 
    } 

    public Room (String pDescription, Item pItem){ 
     roomDescription = pDescription; 
     item = pItem; 
    } 

    public String getRoomDescription(){ 
     return roomDescription; 
    } 

    public Item getItem(){ 
     return item; 
    } 

    public void addItem (Item i){ 
     item = i; 
    } 

    public boolean hasItem(){ 
     if(item != null){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 

    public void addNeighbor (String pDirection, Room r){ 
     myNeighbors.put(pDirection, r); 
    } 

    public Room getNeighbor (String pDirection){ 
     return myNeighbors.get(pDirection); 
    } 

    public Item removeItem(){ 
     item = null; 
     return item; 
    } 

    public String getLongDescription(){ 
     String longDescription = "You are at " + roomDescription + "You see " + item; 
     return longDescription; 
    } 
} 
+0

你需要'new' _myNeighbors_在构造 – mshsayem 2012-04-05 01:10:48

+1

答案通常是显而易见如果你只是看看抛出行NPE并检查该行上的哪个变量为空。这是一个你应该尽可能自己开始做的过程。 – 2012-04-05 01:11:07

+0

另请注意,您的'removeItem'方法将始终返回null。你可能想要做的是这样的:'{item oldItem = item; item = null;返回oldItem; }' – 2012-04-05 01:13:03

回答

2

您从未初始化过myNeighbors;这仅仅是一个指向无处不在的参考。

考虑private HashMap <String, Room> myNeighbors = new HashMap<String,Room>();

1

下面的代码不为空安全:

public void addNeighbor (String pDirection, Room r){ 
    myNeighbors.put(pDirection, r); 
} 

public Room getNeighbor (String pDirection){ 
    return myNeighbors.get(pDirection); 
} 

你可以试试:

public void addNeighbor (String pDirection, Room r){ 
    if(myNeighbors == null) { 
     myNeighbors = new HashMap <String, Room>(); 
    } 
    myNeighbors.put(pDirection, r); 
} 

public Room getNeighbor (String pDirection){ 
    if(myNeighbors == null) { 
     myNeighbors = new HashMap <String, Room>(); 
    } 
    return myNeighbors.get(pDirection); 
} 

或者

private HashMap <String, Room> myNeighbors = new HashMap <String, Room>(); 
+0

你*可以*做到这一点,但是在施工时初始化'myNeighors'会更有意义。 – 2012-04-05 01:11:52

+0

谢谢大家!我现在拥有它。 – 2012-04-05 01:27:26

1

我的邻居是永远不会初始化。

你忘了这一点:

private HashMap <String, Room> myNeighbors= new HashMap<String Room>(); 

问候。

1

你必须new的地图。更改像构造:

public Room (String pDescription, Item pItem) 
{ 
     roomDescription = pDescription; 
     item = pItem; 
     // add this 
     myNeighbors = new HashMap <String, Room>(); 
} 

和改变其他构造函数:

public Room (String pDescription) 
{ 
     this(pDescription, null); 
} 
相关问题