【问题标题】:adding items to an Hashmap and getting error null.pointer.exception将项目添加到 Hashmap 并收到错误 null.pointer.exception
【发布时间】:2014-11-26 05:01:51
【问题描述】:
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;
    }
}

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

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

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

【问题讨论】:

  • 因为myNeighbor是一个hashMap,你知道不能有多个north/south/east/west键吗?
  • 我在 Room nextRoom = currentRoom.getNeighbor(direction); 处收到错误消息;
  • @Pier-AlexandreBouchard 你是什么意思我不能有多个北/南/东/西键?
  • 在 createRooms() 中。例如,您尝试使用“west”键添加至少两个房间(hallway.addNeighbor(“west”,upstairsLobby);kitchen.addNeighbor(“west”,浴室))。 Hashmap 将只允许一个“west”键。

标签: java arraylist hashmap


【解决方案1】:

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

所以在你的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 分配给任何对象。

现在进入下一行,Game 类的getMessage() 方法只是返回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 已正确初始化,而不是创建新变量。

您还需要像这样初始化Room 类的myNeighbor 变量:

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 实例变量。

【讨论】:

  • 是的,但在公共 Game() 中我继续初始化这些实例变量
  • @Christopher,添加了清晰的解释以显示为什么变量为空,请检查。
  • 好的,我正在关注你,现在对我来说很有意义,我需要在哪里初始化 currentRoom 以使其不为空。提前感谢您对我的耐心
  • @Christopher,您正在初始化 createRooms() 中的所有内容,因此调用该方法,编辑我的答案以在构造函数中显示代码。
  • @Christopher,请参阅我的代码更新部分,并按照他们解决您的问题。
【解决方案2】:

你确定这是你运行的代码吗? 首先看你的main方法

  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());
    }

根据你的代码 sn-p 你会得到编译时错误 加上无法访问的代码也

******************************已编辑******************** ********

像这样改变你的构造函数

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

【讨论】:

  • 是的,这是我运行的主要方法,它符合但当我运行它时,当我第一次尝试移动时立即收到错误。
  • 变量g的初始化部分在哪里??你不应该关闭像public static void main(String ar){ **code** }这样的主要方法
  • 哦,哇,我不知道为什么它没有正确复制和粘贴,但是这是我使用的代码: public static void main(String args[]) { Game g = new Game(); System.out.println(g.getMessage());那么剩下的都是一样的
  • 我想如果你已经正确初始化了所有东西但是hallway的初始化部分在哪里?我认为currentRoomnull
  • 首先调用createRooms 方法,然后他们尝试。或在构造函数中调用createRooms 作为第一条语句
【解决方案3】:

尝试调试您的代码。而且在 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();
    }
}

【讨论】:

  • 我将该代码放在 move 方法中,当我运行 main 方法时,main 方法的其余部分被注释掉(在第一次 move("west") 之后它仍然返回 null
  • 在 Blue J 终端窗口中,它显示的都是空值。
  • 好的。您的 main 方法中的 g 是什么?
  • 调用新游戏。来自我的公共 Game() 方法。
  • 查看更新的Game() 构造函数和move() 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-03
  • 2020-03-19
相关资源
最近更新 更多