不知道为什么我得到这个空指针异常错误
我正在研究一个基于文本的冒险游戏项目。它涉及房间内的物品,并从一个房间到另一个房间导航。有一个叫Item的类,这个叫做Room的大类。我所有的方法似乎除了addNeighbor(大概也是getNeighbor),我创建了一个房间,并且工作得很好,我创建了第二个房间,但是当我尝试添加一个邻居时,它崩溃并给了我一个空指针异常。我在这里做错了什么?不知道为什么我得到这个空指针异常错误
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;
}
}
您从未初始化过myNeighbors
;这仅仅是一个指向无处不在的参考。
考虑private HashMap <String, Room> myNeighbors = new HashMap<String,Room>();
。
下面的代码不为空安全:
public void addNeighbor (String pDirection, Room r){
myNeighbors.put(pDirection, r);
}
public Room getNeighbor (String pDirection){
return myNeighbors.get(pDirection);
}
你可以试试:
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);
}
或者
private HashMap <String, Room> myNeighbors = new HashMap <String, Room>();
你*可以*做到这一点,但是在施工时初始化'myNeighors'会更有意义。 – 2012-04-05 01:11:52
谢谢大家!我现在拥有它。 – 2012-04-05 01:27:26
我的邻居是永远不会初始化。
你忘了这一点:
private HashMap <String, Room> myNeighbors= new HashMap<String Room>();
问候。
你必须new
的地图。更改像构造:
public Room (String pDescription, Item pItem)
{
roomDescription = pDescription;
item = pItem;
// add this
myNeighbors = new HashMap <String, Room>();
}
和改变其他构造函数:
public Room (String pDescription)
{
this(pDescription, null);
}
你需要'new' _myNeighbors_在构造 – mshsayem 2012-04-05 01:10:48
答案通常是显而易见如果你只是看看抛出行NPE并检查该行上的哪个变量为空。这是一个你应该尽可能自己开始做的过程。 – 2012-04-05 01:11:07
另请注意,您的'removeItem'方法将始终返回null。你可能想要做的是这样的:'{item oldItem = item; item = null;返回oldItem; }' – 2012-04-05 01:13:03