2

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

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

对象 Hotel 的构造函数,它创建一个大小为 NUM_ROOMS 的新数组

这是包含的更新,不幸的是我仍然遇到空指针问题

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 处为该实例分配一个数组引用(在代码第一次初始化时定义为零,然后增加一)

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;

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

有什么想法吗?

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

编辑*** 感谢您的帮助,找不到变量的问题已经解决,但是每次我尝试引用数组中的对象时,我仍然得到一个空指针异常。这是我如何尝试引用数组的示例:

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

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

4

2 回答 2

4

问题是,在构造函数中,您在其范围内定义了一个名为 theRoom 的变量,这意味着您不会将值 new Room[NUM_ROOMS] 分配给名为theRoom的 Hotel 类字段,而是分配给构造函数中名为房间

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

public Hotel(String hotelName)
{
 this.name = hotelName;
 this.theRoom = new Room[NUM_ROOMS];
}
于 2012-11-24T00:33:42.987 回答
3

问题出在 Hotel 的构造函数中:

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];
}
于 2012-11-24T00:35:19.833 回答