检查布尔值时,我不断收到nullpointer异常错误

时间:2018-03-23 10:10:33

标签: java

在BlueJ和Eclipse中,我在检查String-equality时得到一个nullpointer异常。

这是我的代码:

import java.util.Set;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.Iterator;

/**
 * Class Room - a room in an adventure game.
 *
 * This class is part of the "World of Zuul" application. 
 * "World of Zuul" is a very simple, text based adventure game.  
 *
 * A "Room" represents one location in the scenery of the game.  It is 
 * connected to other rooms via exits.  For each existing exit, the room 
 * stores a reference to the neighboring room.
 *
 * @author  Michael Kölling and David J. Barnes
 * @version 2016.02.29
 */

public class Room
{
    private String description;
    private String itemDescription;
    private HashMap<String, Room> exits;        // stores exits of this room.
    private ArrayList<Item> items;

    /**
     * Create a room described "description". Initially, it has
     * no exits. "description" is something like "a kitchen" or
     * "an open court yard".
     * @param description The room's description.
     */
    public Room(String description)
    {
        this.description = description;
        this.itemDescription = "This room contains: ";
        exits = new HashMap<>();
        items = new ArrayList<Item>();
    }

    public Room(String description, Item item)
    {
        items = new ArrayList<Item>();
        this.description = description;
        addItem(item);
        this.itemDescription = "This room contains: " + item.getLongDescription() ;
        exits = new HashMap<>();
    }
    /**
     * Define an exit from this room.
     * @param direction The direction of the exit.
     * @param neighbor  The room to which the exit leads.
     */
    public void setExit(String direction, Room neighbor)
    {
        exits.put(direction, neighbor);
    }

    public void addItem(Item item)
    {
        items.add(item);
        System.out.println(itemDescription.equals("This room contains: "));
        this.itemDescription = this.itemDescription + /*(this.itemDescription.equals("This room contains: ") ?
        "" : ", ")*/ ", " + item.getLongDescription();
    }

    public void removeItem(String shortItemDescription){
        int i= 0;
        Iterator<Item> it = items.iterator();
        while(it.hasNext()){
            if (it.next().getShortDescription().equals(shortItemDescription)){
                it.remove();
                i++;
            }
            else
                i++;
        }
    }

    public  ArrayList<Item> getItems(){
        return items;
    }

    /**
     * @return The short description of the room
     * (the one that was defined in the constructor).
     */
    public String getShortDescription()
    {
        return description;
    }

    /**
     * Return a description of the room in the form:
     *     You are in the kitchen.
     *     Exits: north west
     * @return A long description of this room
     */
    public String getLongDescription()
    {
        return "You are " + description + ".\n" + (itemDescription.equals("This room contains: ") ?
                "This room is empty" : itemDescription) + ".\n" + getExitString();
    }

    /**
     * Return a string describing the room's exits, for example
     * "Exits: north west".
     * @return Details of the room's exits.
     */
    private String getExitString()
    {
        String returnString = "Exits:";
        Set<String> keys = exits.keySet();
        for(String exit : keys) {
            returnString += " " + exit;
        }
        return returnString;
    }

    /**
     * Return the room that is reached if we go from this room in direction
     * "direction". If there is no room in that direction, return null.
     * @param direction The exit's direction.
     * @return The room in the given direction.
     */
    public Room getExit(String direction)
    {
        return exits.get(direction);
    }
}

在方法addItem(Item item)中,在检查字符串比较方法itemDescription.equals("This room contains: ")时,以及在System.out.println() - 语句中,如在已注释的三元运算符中,我得到一个nullpointer异常错误 - 测试itemDescription.equals("This room contains: ")

奇怪的是getLongDescription()中的三元运算符运行正常。

1 个答案:

答案 0 :(得分:1)

如果您使用Room构建Item个实例。在实例化addItem变量之前调用itemDescription

public Room(String description, Item item) 
{
    // ...
    addItem(item);
    this.itemDescription = "This room contains: " + item.getLongDescription() ;
    // ...
}

因此,在方法addItem中,this.itemDescription仍为空。

public void addItem(Item item)
{
    // ...
    System.out.println(itemDescription.equals("This room contains: ")); 
    // ...
}

这打破了。

要解决此问题,请在实例addItem后致电itemDescription。请注意,您不需要添加item说明,因为这已在addItem方法中完成。

public Room(String description, Item item) 
{
    // ...
    this.itemDescription = "This room contains: ";
    addItem(item);
    // ...
}

你会后悔String itemDescription真的很快!

相反,创建方法getRoomDescription将迭代items列表并生成String itemDescription(使用StringBuilder)!

这样的东西
public String getRoomDescription(){
    StringBuilder sb = new StringBuilder("Rooms contains :");
    for(Item i : items){
         sb.append("\n".append(i.getLongDescription());
    }
    return sb.toString();
}

编辑itemDescription变量很乱并且容易出问题(就像你遇到的那样)。

最后一件事,你用

做的测试
itemDescription.equals("This room contains: ")

应该给你与

相同的结果
items.size() == 0

但是更容易理解(items列表中没有值),如果您编辑打印描述的方式,则不容易出错。