2012-04-05 7 views
1

Ich arbeite an einem Text-basierten Adventure-Spiel-Projekt. Es beinhaltet Räume mit Gegenständen darin und navigieren von Raum zu Raum. Es gibt eine Klasse namens Item und diese größere Klasse namens Room. Alle meine Methoden scheinen zu funktionieren, außer addNeighbor (und vermutlich auch getNeighbor). Ich habe einen Raum mit einem Objekt erstellt und das hat gut funktioniert, und ich habe einen zweiten Raum erstellt, aber als ich einen Nachbarn hinzufügen wollte, stürzte er ab und gab mir eine Nullzeiger-Ausnahme. Was mache ich hier falsch?nicht sicher, warum ich diesen Null Pointer Exception Fehler

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

Sie müssen 'new' _myNeighbors_ im Konstruktor – mshsayem

+1

Die Antwort ist in der Regel klar, wenn man nur die Linie buchen, die wirft die NPE und überprüfen, um zu sehen, welche Variable in dieser Zeile null ist. Dies ist ein Prozess, den Sie möglichst selbstständig beginnen sollten. –

+0

Beachten Sie auch, dass Ihre Methode 'removeItem' immer Null zurückgibt. Was du wahrscheinlich machen wolltest, ist ungefähr so: '{Item oldItem = item; item = null; return oldItem; } ' –

Antwort

2

Sie haben nie initialisiert myNeighbors; Es ist nur eine Referenz, die ins Nirgendwo weist.

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

1

Der folgende Code ist nicht null sicher:

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

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

Sie versuchen können:

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

Oder

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

Sie * könnten * dies tun, aber es wäre viel sinnvoller,' myNeighors' beim Aufbau zu initialisieren. –

+0

Danke euch allen! Ich habe es jetzt. –

1

meine Nachbarn nie initialisiert.

Sie haben vergessen, diese:

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

Grüße.

1

Sie müssen new die Karte. Ändern Sie den Konstruktor wie:

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

und ändern Sie den anderen Konstruktor:

public Room (String pDescription) 
{ 
     this(pDescription, null); 
} 
Verwandte Themen