2012-04-05 131 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); 
} 
相關問題