将项添加到Hashmap并获取错误null.pointer.exception

时间:2014-11-26 05:01:51

标签: java arraylist hashmap

import java.util.ArrayList;
import java.util.HashMap;
/**
 * Write a description of class Game here.
 * 
 * @author (Christopher ) 
 * @version (a version number or a date)
 */
public class Game
{
    ArrayList <Item> myArray;
    HashMap <String, Room> myNeighbor;
    Room currentRoom;
    String currentMessage;
    Room hallway, kitchen, bathroom, livingRoom, upstairsLobby, blakesRoom, jaysRoom, mikesRoom;
    Item crumbs, eggs, cellPhone, textBooks, poptarts, pizzaRolls, clothes, chips; 
    public Game()
    {
        ArrayList <Item> myArray = new ArrayList();
        currentRoom = hallway;
    }

    private void createRooms()
    {
        myNeighbor = new HashMap <String, Room> ();

        crumbs = new Item("Crumbs", "small crumbs of some kind of food", 100);
        eggs = new Item("Raw Eggs", "a couple of raw eggs still contained within their egg shells", 1100);
        cellPhone = new Item("Cell Phone", "Mike's cell phone he must have forgotten here...", 0);
        textBooks = new Item("Textbooks", "Jay's textbooks, because he can't use his bedroom to store his stuff", 0);
        poptarts = new Item("Pop Tarts", "an un-opened box of chocolate pop tarts that someone must have left behind...", 1500);
        pizzaRolls = new Item("Pizza Rolls", "cooked steaming pizza rolls piled high", 2000);
        clothes = new Item("Clothes", "clothes, a lot of clothes all over the floor and all over the room, who knows if they're clean or not...", 0);
        //        miningTools = new Item("Mining Tools", "pickaxes, drills, and everything else you need to extract rocks and minerals from the earth's crust", 100);
        chips = new Item("Chips", "chip bag hidden away that is only half full now", 400);

        hallway = new Room("in a dark hallway with crumbs scattered over the ground", crumbs);
        kitchen = new Room("in a kitchen with raw eggs lying on the counter tops", eggs);
        bathroom = new Room("in a bathroom with a stand up shower, a washer, a drier, and Mike's cell phone left behind laying on the counter", cellPhone);
        livingRoom = new Room("in a living room with Jay's textbooks all over the room", textBooks);
        upstairsLobby = new Room("in a lobby at the top of the stairs with a box of pop tarts on the ground", poptarts);
        blakesRoom = new Room("in a dark room with towers of pizza rolls covering the desk and scattered across the bed", pizzaRolls);
        jaysRoom = new Room("in a cluttered room with clothes covering every inch of the floor and nothing hanging on the walls", clothes);
        mikesRoom = new Room("in a bed room with mining tools and a bag of chips hidden underneath a pillow on the bed", chips);

        hallway.addNeighbor("north", kitchen);
        hallway.addNeighbor("west", upstairsLobby);
        hallway.addNeighbor("east", livingRoom);
        kitchen.addNeighbor("west", bathroom);
        kitchen.addNeighbor("south", hallway);
        bathroom.addNeighbor("east", kitchen);
        livingRoom.addNeighbor("west", hallway);
        upstairsLobby.addNeighbor("north", jaysRoom);
        upstairsLobby.addNeighbor("west", blakesRoom);
        upstairsLobby.addNeighbor("east", mikesRoom);
        upstairsLobby.addNeighbor("south", hallway);
        blakesRoom.addNeighbor("east", upstairsLobby);
        jaysRoom.addNeighbor("south", upstairsLobby);
        mikesRoom.addNeighbor("west", upstairsLobby);

    }

    private void setWelcomeMessage()
    {
        currentMessage = "You are locked inside of a campus view apartment.  The goal of this game is to eat 5000 calories to maximize gains so you can leave.  You will have to navigate around the apartment searching for food and eating it to obtain your calorie goal.";
    }

    public String getMessage()
    {
        return currentMessage;
    }

    public void help()
    {
        String message1 = "If you are short on calories, be sure to check the bedrooms";
        String message2 = "Don't forget to go upstairs";
        String reminder = "Remember the goal of the game to get 5000 calories";
    }

    public void look()
    {
        currentMessage = currentRoom.getLongDescription();
    }

    public void move(String direction)
    {
        String msg;

       Room nextRoom = currentRoom.getNeighbor(direction);
        if (nextRoom == null){
            msg = "You can't go in that direction";
        }
        else{
            currentRoom = nextRoom;
            msg = currentRoom.getLongDescription();
        }
    }
    // 
    //     public boolean gameOver()
    //     {
    //         int count = 0;
    // 
    //         for(int i = 0; i < myArray.size(); i++ ){
    //             count += myArray.indexOf(i).getCalories(;
    //         }
    //         if(count == 5000){
    //             currentMessage = "You have won!";
    //             return true;
    //         }
    //         else{
    //             return false;
    //         }
    //     }

    public void take()
    {      

        if(currentRoom.hasItem() == false){
            currentMessage = "there is not an item in the room to take";
        }
        else if(currentRoom.getItem().getCalories() > 100){
            currentMessage = "there is not enough calories in here for you to increase gains";
        }
        else{
            currentRoom.addItem(currentRoom.getItem());
            currentMessage = "you are now holding the item";
        }
    }

    private Item checkForItem(String name)
    {

        for(int i = 0; i < myArray.size(); i++ ){
            if(i + "" == name){
                return currentRoom.getItem();
            }            
        }
        return null;
    }

    public void drop(String name)
    {      

        for(int i = 0; i < myArray.size(); i++ ){
            Item temp = myArray.remove(i);
            if(i + "" == name  && currentRoom.hasItem() == false){
                myArray.remove(i);
                currentRoom.addItem(temp);
                currentMessage = "you have successfully dropped the item in the room";
            }
            else if(currentRoom.hasItem() == true)
            {
                currentMessage = "the room already has an item";
            }
            else if(i +"" != name)
            {
                currentMessage = "you are not holding that item";
            }
        }
    }

    public void show()
    {
        if(myArray.size() > 0){
            currentMessage = "" + myArray;
        }
    }

    public static void main(String ar
        System.out.println(g.getMessage());
        g.move("west");
        System.out.println(g.getMessage());
        g.take();
        System.out.println(g.getMessage());
        g.move("west");
        System.out.println(g.getMessage());
        g.move("east");
        System.out.println(g.getMessage());
        g.move("south");
        System.out.println(g.getMessage());
        g.move("west");
        System.out.println(g.getMessage());
    }
}

**************************************************************************************************
import java.util.HashMap;
/**
 * Write a description of class Room here.
 * 
 * @author (Christopher Saikalis) 
 * @version (a version number or a date)
 */
public class Room
{
    private String description;
    private Item item;
    private HashMap <String, Room> myNeighbor;

    public Room (String pDescription)
    {
        description = pDescription;
        item = null;
        HashMap <String, Room> myNeighbor = new HashMap <String, Room> ();
    }

    public Room (String pDescription, Item pItem)
    {
        description = pDescription;
        item = pItem;
    }

    public String getDescription()
    {
        return description;
    }

    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)
    {
        myNeighbor.put(pDirection, r);   
    }

    public Room getNeighbor(String pDirection)
    {
        Room next = myNeighbor.get(pDirection);
        return next;
         if(next != null){
             return next;
         }
         else{
             return null;
         }
    }

    public Item removeItem()
    {
        Item temp;
        temp = item;
        item = null;
        return temp;
    }

    public String getLongDescription()
    {
        String part1 = "You are " + description;
        String part2 = "You see ";
        if(item != null){
            return part1 + "" + part2 + "" + item.getDescription() + "" + item.getCalories();
        }
        return part1;
    }
}

第一部分是我的游戏类,游戏类负责跟踪玩家的物品和当前位置。第二部分是我的房间类,实现一个类来维护房间的信息,包括:房间的描述(字符串),项目(项目)和所有相邻房间的列表(HashMap)。

当我运行main方法来测试方法时,我会调用每个方法的null.pointer.exception。由于某种原因(我不知道为什么)当我运行调试器时,每个变量都设置为null,所以我认为这就是我收到错误的原因。任何帮助我如何解决这个问题,或者如果有什么我做错了请帮助。这也是我的第一个编程学期,所以我是半初学者。

****************** UPDATE !!!! ************ 好的,我改变了我的构造函数,似乎已经解决了这个问题?现在我仍然在这里得到相同的错误myNeighbor.put(pDirection,r);在我的房间类中的public void addNeighbor(String pDirection,Room r)(原帖的第二部分)

3 个答案:

答案 0 :(得分:0)

尝试调试代码。而且在eclipse中你可以添加NullPointerExeption作为你的断点和调试。

将您的代码包含在try and catch block中,以便您可以找到获得异常的行

public static void main(String ar[]) {
    try {
        System.out.println(g.getMessage());
        g.move("west");
        System.out.println(g.getMessage());
        g.take();
        System.out.println(g.getMessage());
        g.move("west");
        System.out.println(g.getMessage());
        g.move("east");
        System.out.println(g.getMessage());
        g.move("south");
        System.out.println(g.getMessage());
        g.move("west");
        System.out.println(g.getMessage());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

并在您的问题中粘贴堆栈跟踪。

修改

由于createRooms()是私有方法,因此必须从类方法或构造函数中调用它。

public Game()
{
    ArrayList <Item> myArray = new ArrayList();
    createRooms();
    currentRoom = hallway;
    look(); //Add this
}

以这种方式改变你的构造函数

public Room (String pDescription, Item pItem)
{
    description = pDescription;
    item = pItem;
    HashMap <String, Room> myNeighbor = new HashMap <String, Room> (); //Added
}

编辑2:

更新了Game()构造函数。

并改变这样的移动方法。

public void move(String direction)
{
    Room nextRoom = currentRoom.getNeighbor(direction);
    if (nextRoom == null){
        currentMessage = "You can't go in that direction";
    }
    else{
        currentRoom = nextRoom;
        currentMessage = currentRoom.getLongDescription();
    }
}

答案 1 :(得分:0)

你知道这是你跑的代码吗? 首先看看你的主要方法

  public static void main(String ar
        System.out.println(g.getMessage());
        g.move("west");
        System.out.println(g.getMessage());
        g.take();
        System.out.println(g.getMessage());
        g.move("west");
        System.out.println(g.getMessage());
        g.move("east");
        System.out.println(g.getMessage());
        g.move("south");
        System.out.println(g.getMessage());
        g.move("west");
        System.out.println(g.getMessage());
    }

根据您的代码段,您将收到编译时错误 加上无法访问的代码

**************************编辑******************** ********

像这样改变你的构造函数

  public Game()
    {
        ArrayList <Item> myArray = new ArrayList();
        createRooms();
        currentRoom = hallway;
    }

答案 2 :(得分:0)

默认情况下,class的所有实例变量都已分配到null中的Java

因此,在Game类中,实例变量的声明如下:

public class Game
{
    ....
    Room currentRoom;
    String currentMessage;
    ....
}

显然,变量没有任何对象,因此它们是null

现在从您的主要方法开始,您就是这样做的:

public static void main(String args[]){
    Game g = new Game();
    System.out.println(g.getMessage());
    g.move("west");
    ....
}

来到第一行Game g = new Game();这里Java调用你的构造函数,所以代码是:

public Game()
{
    ArrayList <Item> myArray = new ArrayList();
    currentRoom = hallway;
}

您在此处将参考currentRoom分配给hallway也是null,因为您未被hallway分配给任何对象。

现在进入下一行,getMessage()类的Game方法只返回currentMessage实例变量null。因此g.getMessage()的输出为null

main方法的下一行g.move(..),所以来到move()方法:

public void move(String direction)
{
   Room nextRoom = currentRoom.getNeighbor(direction);
   ...
} 

在这里,您尝试访问变量currentRoom而不进行初始化,因此它仍然是null对象,因此您将获得java.lang.NullPointerException

<强>更新

所以改变这样的代码:

public Game()
    {
        createRooms();
        myArray = new ArrayList();
        currentRoom = hallway;
    }

在上面的代码中,您可以看到现在我们正在调用createRooms()并且myArray已正确初始化,而不是创建新变量。

此外,您需要初始化myNeighbor类的Room变量,如下所示:

public Room(String pDescription, Item pItem) {
        description = pDescription;
        item = pItem;
        myNeighbor = new HashMap <String, Room> ();
    } 

新更新:

像这样更改move方法:

public void move(String direction)
{
    Room nextRoom = currentRoom.getNeighbor(direction);
    if (nextRoom == null){
        currentMessage = "You can't go in that direction";
    }
    else{
        currentRoom = nextRoom;
        currentMessage = currentRoom.getLongDescription();
    }
}

我已删除msg局部变量并在此处使用currentMessage实例变量。