2011-12-04 248 views
0

我正在用Java創建一個命令行遊戲。有一個遊戲課堂和課堂課程的基本前提:進入正確的房間,遊戲結束。HashMap返回null

從每個房間的用戶可以通過移動方向:

public void move (String direction) { 
    Room nextRoom = currentLocation.getNeighbor(direction); //this is the problem, always nil 
    if (nextRoom == null){ 
     msg = "You can't go in that direction"; 
     }else{ 
     currentLocation = nextRoom; 
     msg = currentLocation.getLongDescription(); 
    } 
    } 

的問題是,這種.getNeighbor方法返回nil,所以這個問題是我的getNeighbor方法我的房類中或可能與我怎麼創造房間。這裏是客房類中我getNeighbor方法:

public Room getNeighbor(String rDirection){ 
     Room next = map.get(rDirection); 
     return next; 
    } 

這需要我的字符串,並期待在我創建,看看他們是朝着這一方向鍵一個房間一個HashMap的地圖。恐怕這個問題是我如何創建我的房間的方向的HashMap:

在我的房間類別:

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

我有一個創建地圖的方法在我的房間類,我初始化我比賽的時候調用。下面是增加方向的方法,然後我在我的遊戲類我打電話:

// Room Class Method 

    public void addNeighbor(String rDirection, Room r){ 
     map.put(rDirection, r); 
    } 

// Game Class - Initializing the Rooms 

kitchen.addNeighbor("east", foyer); 
kitchen.addNeighbor("north", library); 

我無法找到一個鄰居到我的房間,從任何一個房間我看看。錯誤發生在註釋行上,但我認爲這是我的房間類方法,或者我創建HashMap的方式(我以前從未使用過)。無論如何,我想知道是否有人能夠幫助指出我似乎錯過了什麼,以及爲什麼我的房間在我的地圖中沒有任何鄰居。萬分感謝。

+0

爲了更好地幫助您:1)發佈[SSCCE](http://sscce.org/)。 2)提出問題。 –

回答

1

我在片段中看不到任何明顯的錯誤。我建議你使用調試器來運行代碼,檢查各個對象的狀態。

FWIW,以HashMap<String,Room>.get(x)通話將返回null如果(且僅當)下列之一:

  • 沒有地圖條目x,或
  • x地圖項null

如果我是做一個猜測,這將是你沒有正確初始化的Room實例currentLocation指。例如,如果currentLocation提到廚房,那麼也許你試圖去"south"或者foyernull

另一種可能性是direction字符串拼寫或大寫錯誤,因此與您配置的某個方向不匹配。 (並且就此而言,如果您宣佈enum表示已識別的方向,並將其用作地圖的關鍵類型以及您的程序的其餘部分,則程序將更加穩健。)

+0

這個問題是一個範圍/順序的問題,我在創建該房間的值之前將當前位置啓動到一個房間。我真的很感謝所有的幫助。 – Kombo

1

這實際上比「答案」更像是一個「評論」,但它不適合評論,所以在這裏。 。 。

您的問題中包含的代碼沒有任何明顯錯誤。問題可能在其他地方。有一兩件事,這將有助於你調試是,如果你改變了這個:

if (nextRoom == null){ 
    msg = "You can't go in that direction"; 
    } 

到這樣的事情:

if(nextRoom == null) 
{ 
    System.out.println("Illegal direction '" + direction + "' requested from" + 
         " room '" + currentLocation.getDescription() + "'."); 
    System.out.println("(map is: " + map + ")"); 
    msg = "You can't go in that direction"; 
} 

,將告訴你究竟是什麼direction,並且正是什麼direction能是。有些事情看出來的:

  • 區分大小寫,如果direction是(比方說)"East",而不是"east"
  • 空格,如果direction是(說)"east "而不是"east"
  • 映射條目存在,但值爲null。 (kitchen.addNeighbor("east", foyer);不會幫助任何東西,如果foyernull當你插入。)
1

這並不直接解決您的問題(與其他人一樣,我沒有看到任何跳出除了大小寫和這樣),但我建議使用枚舉作爲你的關鍵,而不是一個字符串。字符串對描述文本很有用,但它們往往不能替代其他的東西(如方向)。

枚舉將有超過字符串一些優勢在這種情況下:

  • 這使得代碼自記錄文件;你可以很容易地看到方法可能會出現哪些值
    • 例如,你不需要記住它是否被稱爲「北」,「北」,「北」或「向上」。這只是Direction.NORTH,如果你不明白這一點不會編譯正確
    • 這是來電者以及實施者
  • 你可以創建你的地圖作爲一個EnumMap的,而不是HashMap中有用, (儘管這在您的應用中可能不是問題)