HashMap返回null

时间:2011-12-04 04:54:16

标签: java

我正在努力用Java创建一个命令行游戏。有一个Game类和Room类的基本前提:到达正确的房间,游戏结束。

用户可以从每个房间移动方向:

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,所以问题在于我的Room类中的getNeighbor方法,或者可能与我如何创建房间有关。这是Room Class中的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);

我无法从我看的任何房间找到我房间的邻居。错误发生在注释行上,但我认为它实际上是我的Room Class方法,或者我正在创建HashMap的方式(我之前从未使用过)。无论如何,我想知道是否有人可以帮助指出我似乎缺少的东西,以及为什么无论我的房间在我的地图中没有任何邻居。非常感谢。

3 个答案:

答案 0 :(得分:1)

我在片段中看不到任何明显的错误。我建议您使用调试器运行代码,检查相应对象的状态。

FWIW,如果(且仅当)以下某项内容,对HashMap<String,Room>.get(x)的调用将返回null

  • x
  • 没有地图条目
  • x的地图条目为null

如果我要猜测,那就是您没有正确初始化Room引用的currentLocation实例。例如,如果currentLocation提到了厨房,那么您可能想要"south"foyer null {。}}。

另一种可能性是direction String的拼写或大小写错误,因此不符合您配置的其中一个方向。

(并且就此而言,如果您声明enum来表示已识别的路线,并且将其用作地图的关键类型......以及整个程序的其余部分,您的程序将更加强大。)

答案 1 :(得分: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时无效。)

答案 2 :(得分:1)

这并不能直接解决您的问题(就像其他人一样,除了区分大小写之外,我没有看到任何跳出来的内容等),但我建议您使用枚举作为密钥,而不是一个字符串。字符串很适合描述文本,但它们往往不能替代其他东西(如方向)。

在这种情况下,枚举比String更有优势:

  • 它使代码自我记录;您可以轻松地查看方法可能期望的确切值
    • 例如,您不需要记住它是否被称为&#34; NORTH&#34;,&#34; north&#34;,&#34; North&#34;或&#34; Up&#34;。它只是Direction.NORTH,如果你做不好就不会编译
    • 这对呼叫者和实施者都很有用
  • 您可以将地图创建为EnumMap而不是HashMap,效率更高(虽然这可能不是您应用中的问题)