Java 哈希映射返回空值
我正在用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
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,如果你不正确,它将无法编译
- 这对调用者和实现者都很有用
- 您可以创建您的