2012-11-24 31 views
2

好吧,我正在生成一個空指針異常的代碼,這意味着我的代碼嘗試在它應該使用對象的位置使用空值(直在API之外)。我在做的是我有一個名爲Hotel的類,它有一個構造函數,它將一個字符串值賦給一個變量並創建一個類型爲Room的對象的數組。我知道這應該是直接的,但對於我的生活,我無法弄清楚這一點。將對象添加到數組時,出現NullPointerException

我會盡量保持代碼的簡約越好:

構造一個對象,酒店,創建大小NUM_ROOMS的新數組

這裏有包括更新,我還在堅持與空指針問題不幸

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

此構造函數創建類型間,它的參數被分配給變量的陣列

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在陣列參考該實例來創建所述對象間的一個新實例(定義爲零時的代碼首先被初始化然後由一個後增加)

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是未使用的,儘管我在前面提到的方法中使用了它。這導致我相信我沒有正確引用該對象。但是,我不知道爲什麼那個引用是不正確的,即使我在房間[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()是從物體間

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

返回可變速率的方法導致了空指針在這個情況下。我的對象引用有問題嗎?

回答

4

的問題是,在構造函數中,你在其範圍內一個名爲瞟着房間變量,這意味着你將不會被分配價值的新客房[NUM_ROOMS]名爲瞟着房間您的酒店類領域,而是正在定義一個名爲theRoom的構造函數中的變量。

只需刪除構造函數中的類型聲明(Room []),它將按預期工作。 我還建議在將來使用這個關鍵字來幫助您避免這類問題。

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

不幸的是我還在正從到數組引用一個空指針異常,例如 totalRate = totalRate +瞟着房間[I] .getRate(); 其中getRate()是返回Room構造函數中描述的rate變量的方法。 該代碼仍然給我一個空指針,如果我的引用無效 – UvrD

+2

好吧,創建一個新房間[NUM_ROOMS]將創建一個數組,最多可以存儲NUM_ROOMS個對象房間,但默認情況下每個位置都由null初始化。所以,除非您在租用所有房間時調用getTotalRentalSales(),否則您將始終獲得NPE。你想執行操作totalRate = totalRate + theRoom [i] .getRate();直到我 pabrantes

+0

優秀的洞察那裏pabrantes,你只是爲我在那裏促進了一個重大的「燈開關」的時刻,非常感謝。 我最終只是改變一個方法,以便每次我做了一個新的引用,它增加了一些佔位符變量的計數器。這樣,當我調用任何for循環來操縱數組時,它只會爲元素定義它。 – UvrD

3

的問題是在酒店的構造函數:

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

你可能有一個瞟着房間實例字段,對不對?上述對房間的分配創建了一個局部變量,該變量「隱藏」(並且獨立於)實例實例字段,並且一旦構造函數返回就會丟失。你想要的是初始化瞟着房間實例字段:

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

你的確是正確的,該修復解決了我沒有找到該變量(謝謝你)的問題,除非我嘗試使用引用該數組的方法時仍然出現空指針異常。 我想真正的問題是,是不是可以調用一個數組元素的方法? 作爲示例 totalRate = totalRate + theRoom [i] .getRate(); 其中getRate()是一種方法,返回一個變量的值,仍然產生空指針異常 這是一種無效的方式來調用一個數組中的對象的方法嗎? – UvrD