Java 将对象添加到数组时发生NullPointerException
好的,我遇到了一些生成空指针异常的代码的问题,这意味着我的代码试图在应该使用对象的地方使用空值(直接从API中)。我现在做的是有一个名为Hotel的类,它有一个构造函数,将字符串值赋给变量,并创建一个Room类型的数组,一个对象。我知道这应该是直截了当的,但就我的一生而言,我无法理解这一点 我会尽量保持代码的最低限度: 对象Hotel的构造函数,用于创建新的大小NUM_房间数组 这里是包含的更新,我仍然被空指针问题困扰,不幸的是Java 将对象添加到数组时发生NullPointerException,java,arrays,nullpointerexception,Java,Arrays,Nullpointerexception,好的,我遇到了一些生成空指针异常的代码的问题,这意味着我的代码试图在应该使用对象的地方使用空值(直接从API中)。我现在做的是有一个名为Hotel的类,它有一个构造函数,将字符串值赋给变量,并创建一个Room类型的数组,一个对象。我知道这应该是直截了当的,但就我的一生而言,我无法理解这一点 我会尽量保持代码的最低限度: 对象Hotel的构造函数,用于创建新的大小NUM_房间数组 这里是包含的更新,我仍然被空指针问题困扰,不幸的是 public Hotel(String hotelName) {
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) 使用提供的参数创建对象房间的新实例
2) 在索引roomsRented处为该实例分配一个数组引用(在代码首次初始化时定义为零,然后在初始化后增加1)
我遇到的问题是
theRoom[roomsRented] = roomHolder;
似乎导致空指针异常。我还从Eclipse中得到一个错误,即数组变量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;
}
在这种情况下导致空指针。“我的对象引用”有问题吗?问题在于,在构造函数中,您在其作用域中定义了一个名为Room的变量,这意味着您将不会为new Room[NUM\u ROOMS]赋值指向名为theRoom的酒店类字段,而是指向构造函数中名为theRoom的变量 只需删除构造函数中的类型声明(Room[]),它就会按预期工作。 我还建议将来使用this关键字来帮助您避免此类问题
public Hotel(String hotelName)
{
this.name = hotelName;
this.theRoom = new Room[NUM_ROOMS];
}
问题在于酒店的建造商:
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];
}
您确实是对的,该修复程序解决了我遇到的找不到变量的问题(谢谢您),但当我尝试使用引用该数组的方法时,仍然会出现空指针异常。我想真正的问题是,不可能对数组元素调用方法吗?例如,totalRate=totalRate+theRoom[i].getRate();如果getRate()是一个返回变量值的方法,仍然会产生空指针异常,那么对数组中的对象调用方法是否无效?不幸的是,我仍然会从对数组的引用中获得空指针异常,例如totalRate=totalRate+theRoom[i]。getRate();其中getRate()是一个返回房间构造函数中描述的速率变量的方法。代码仍然给我一个空指针,如果我的引用无效,那么创建一个新的房间[NUM_ROOMS]将创建一个数组,该数组最多可以存储对象房间的NUM_ROOMS,但是默认情况下,每个位置都由null初始化。因此,除非在租完所有房间后调用getTotalRentalSales(),否则您将始终获得NPE。您希望执行操作totalRate=totalRate+theRoom[i].getRate();直到我想起了房间,才想起了房间。在那里,你给了我一个重要的“灯光开关”时刻,非常感谢。我最后只是更改了一个方法,这样每次我进行新引用时,它都会增加一些占位符变量的计数器。这样,当我调用any for循环来操作数组时,它只在为它定义元素时才前进。
public Hotel(String hotelName)
{
name = hotelName;
Room[] theRoom = new Room[NUM_ROOMS];
}
public Hotel(String hotelName)
{
name = hotelName;
theRoom = new Room[NUM_ROOMS];
}