将对象添加到数组时出现NullPointerException

时间:2012-11-24 00:23:36

标签: java arrays nullpointerexception

好吧所以我遇到了一些产生空指针异常的代码的问题,这意味着我的代码试图使用一个空值,它应该使用一个对象(直接从API中)。我正在做的是我有一个名为Hotel的类,它有一个构造函数,它将一个字符串值赋给一个变量,并创建一个Room类型的数组,一个对象。我知道这应该是直截了当的,但对于我的生活,我无法理解这一点。

我会尽量保持代码尽量简约:

对象的构造函数,酒店,用于创建大小为NUM_ROOMS

的新数组

以下是所包含的更新,遗憾的是我仍然遇到Null指针问题

public Hotel(String hotelName)
{
    name = hotelName;
    theRoom = new Room[NUM_ROOMS];
}

此构造函数创建一个Room类型的数组,其参数分配给变量

public Room(String guestName, int partySize, int bedCountRequired,
        double ratePerDay, int daysStaying)
{
    guest = guestName;
    number = partySize;
    numBeds = bedCountRequired;
    rate = ratePerDay;
    numOfDays = daysStaying;
}

以下方法应该是:

1)使用提供的参数

创建对象Room的新实例

2)在索引roomsRented中为该实例分配一个数组引用(当代码首次初始化时定义为零,然后在之后增加1)

public void addReservation(String guestName, int partySize,
        int bedCountRequired, double ratePerDay, int daysStaying)
{
    Room roomHolder = new Room(guestName, partySize, bedCountRequired,
            ratePerDay, daysStaying);

    theRoom[roomsRented] = roomHolder;

    roomsRented++;
}

我遇到的问题是

theRoom[roomsRented] = roomHolder;

似乎导致空指针异常。我也从Eclipse中得到一个错误,即尽管我在上述方法中使用了数组变量theRoom,但它仍未被使用。这让我相信我没有正确引用该对象。但是,我不知道为什么这个引用是不正确的,即使我在theRoom [0]中替换,编译器仍然给我一个空指针。我没有看到我的数组构造有任何问题对我来说意味着唯一可能导致空指针异常的问题是如果我没有引用我的数组中的任何值。

有什么想法吗?

如果答案很简单,请提前感谢任何贡献和道歉。

修改*** 感谢您的帮助,未找到变量的问题已经解决,但每次我尝试引用数组中的对象时,我仍然会得到一个nullpointer异常。以下是我尝试引用数组的示例:

public double getTotalRentalSales()
{
    // Iterate through the array
    for (int i = 0; i < theRoom.length; i++)
    {
        // sum the amount money received per rental
        totalRate = totalRate + theRoom[i].getRate();
    }
    // Return total
    return totalRate;
}

其中getRate()是一个从对象Room返回变量率的方法

totalRate = totalRate + theRoom[i].getRate();

在这种情况下导致空指针。我的对象引用有问题吗?

2 个答案:

答案 0 :(得分:4)

问题在于,在构造函数中,您在其范围内定义了一个名为theRoom的变量,这意味着您不会将值Room [NUM_ROOMS]赋值给名为 theRoom 而是构造函数中名为 theRoom 的变量。

只需删除构造函数中的类型声明(Room []),它就会按预期工作。 我还建议将来使用 this 关键字来帮助您避免此类问题。

public Hotel(String hotelName)
{
 this.name = hotelName;
 this.theRoom = new Room[NUM_ROOMS];
}

答案 1 :(得分:3)

问题在于酒店的构造函数:

public Hotel(String hotelName)
{
    name = hotelName;
    Room[] theRoom = new Room[NUM_ROOMS];
}

你可能有一个theRoom实例字段,对吗?上面对theRoom的赋值创建了一个“隐藏”(并独立于)theRoom实例字段的局部变量,并在构造函数返回后丢失。你想要的是初始化theRoom实例字段:

public Hotel(String hotelName)
{
    name = hotelName;
    theRoom = new Room[NUM_ROOMS];
}