Java 哈希映射返回空值

Java 哈希映射返回空值,java,Java,我正在用Java创建一个命令行游戏。有游戏类和房间类的基本前提是:到达正确的房间,游戏结束 用户可以从每个房间移动一个方向: public void move (String direction) { Room nextRoom = currentLocation.getNeighbor(direction); //this is the problem, always nil if (nextRoom == null){ msg = "You can't

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

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

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类中的getNeighbor方法:

public Room getNeighbor(String rDirection){
        Room next = map.get(rDirection);
        return next;
    }
private HashMap<String , Room> map = new HashMap<String , Room>(); 
这将获取我的字符串,并查看我创建的HashMap映射,以查看它们是否是该方向键上的房间。恐怕问题在于我如何创建房间的方向哈希图:

在我的课堂上:

public Room getNeighbor(String rDirection){
        Room next = map.get(rDirection);
        return next;
    }
private HashMap<String , Room> map = new HashMap<String , Room>(); 

我在任何房间都找不到邻居。错误发生在注释行上,但我认为这实际上与我的Room类方法有关,或者与我创建HashMap的方式有关(我以前从未使用过HashMap)。不管怎样,我想知道是否有人能帮我指出我似乎遗漏了什么,为什么不管我的房间是什么,我的地图上都没有邻居。非常感谢。

我看不出片段中有什么明显的错误。我建议您使用调试器运行代码,并检查各个对象的状态

FWIW,调用HashMap.get(x)将返回
null
如果(且仅当)以下情况之一:

  • 没有
    x
    的映射条目,或
  • x
    的映射条目为
    null

如果让我猜一下,可能是您没有正确初始化
currentLocation
引用的
Room
实例。例如,如果
currentLocation
指的是厨房,那么可能您正试图去
“南部”
,或者
门厅
null

另一种可能是
方向
字符串的拼写或大小写错误,因此与您配置的方向之一不匹配


(请注意,如果您声明了一个
enum
来表示已识别的方向,并将其用作地图的键类型……以及整个程序的其余部分,那么您的程序将更加健壮。)

我看不出代码片段中有任何明显错误。我建议您使用调试器运行代码,并检查各个对象的状态

FWIW,调用HashMap.get(x)将返回
null
如果(且仅当)以下情况之一:

  • 没有
    x
    的映射条目,或
  • x
    的映射条目为
    null

如果让我猜一下,可能是您没有正确初始化
currentLocation
引用的
Room
实例。例如,如果
currentLocation
指的是厨房,那么可能您正试图去
“南部”
,或者
门厅
null

另一种可能是
方向
字符串的拼写或大小写错误,因此与您配置的方向之一不匹配

(注意,如果您声明一个
enum
来表示已识别的方向,并将其用作地图的键类型…以及整个程序的其余部分,那么您的程序将更加健壮。)

这实际上是一个“注释”而不是“答案”,但它不适合注释,因此

问题中包含的代码没有明显的错误。问题可能在别处。帮助您调试的一件事是,如果您更改此选项:

 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";
}
这将准确地告诉您方向是什么,以及方向可以是什么。有些事情需要注意:

  • 区分大小写,如果
    方向
    是(比如)
    “东”
    而不是
    “东”
  • 如果
    方向
    是(说)
    “东”
    而不是
    “东”
    ,则为空白
  • 映射存在但值为
    null
    的条目。(
    kitchen.addNeighbor(“east”,foyer);
    如果插入时
    foyer
    null
    ,则不会有任何帮助。)
这实际上更像是一个“评论”而不是一个“答案”,但它不适合作为一个评论,所以这里

问题中包含的代码没有明显的错误。问题可能在别处。帮助您调试的一件事是,如果您更改此选项:

 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";
}
这将准确地告诉您方向是什么,以及方向可以是什么。有些事情需要注意:

  • 区分大小写,如果
    方向
    是(比如)
    “东”
    而不是
    “东”
  • 如果
    方向
    是(说)
    “东”
    而不是
    “东”
    ,则为空白
  • 映射存在但值为
    null
    的条目。(
    kitchen.addNeighbor(“east”,foyer);
    如果插入时
    foyer
    null
    ,则不会有任何帮助。)

这并不能直接解决您的问题(与其他人一样,除了区分大小写之类的问题外,我没有发现任何其他问题),但我建议使用枚举作为键,而不是字符串。字符串很适合描述文本,但它们往往不能完全替代其他东西(如方向)

在这种情况下,枚举比字符串有一些优势:

  • 它使代码自文档化;您可以很容易地看到方法可能期望的值
    • 例如,您不需要记住它的名称是“北”、“北”、“北”还是“向上”。它只是Direction.NORTH,如果你不正确,它将无法编译
    • 这对调用者和实现者都很有用
  • 您可以创建您的