2014-02-22 31 views
0

我一直在嘗試在JAVA中編寫一個新類,其中我使用Map和HashMap將信息轉發給不同的類,而不是在每個類中本地聲明Map。使用Map和不同類的NullPointerException

我創建了一個新的類 「GetRoom.java」,它有4點不同的方法:

  • 無效 addRoom(INT ID,客房)
  • byID(INT ID)
  • 布爾 containsID(INT ID)
  • doIexist()

的代碼如下:

private static Map<Integer, Room> hotelRooms = new HashMap<Integer, Room>(); 

public static void addRoom(int id, Room room){ 
    hotelRooms.put(id, room); 
} 

public static Room byID(int id){ 
    return hotelRooms.get(id); 
} 

public static Room doIexist(){ 
    return hotelRooms.get(5); 
} 

public static boolean containsID(int id){ 
    return hotelRooms.containsKey(id); 
} 

如果我在其他任何類使用byID函數將返回NullPointerException異常,而如果我使用doIexist函數,那麼它將返回房間ID 5。當打電話給hotelRooms.size()時,我可以看到我已經填滿了42個房間,但無法在GetRoom.java之外引用它們。

任何幫助都非常感謝!

編輯: 這是我從調用代碼:

public static void Compose(ServerHandler Client, User theUser, Environment Server) throws Exception 
{ 
    User CurrentUser = Client.GetSession(); 
    int RoomId = CurrentUser.CurrentRoomId; 
    Channel Socket = Client.Socket; 
    Room R = GetRoom.byID(RoomId); // If I change this to GetRoom.doIExist(); it will work 

    ServerMessage HeightMap = new ServerMessage(ServerEvents.HeightMap1); 
    HeightMap.writeUTF(R.GetModel().getMap()); 
    HeightMap.Send(Socket); 

    ServerMessage RelativeMap = new ServerMessage(ServerEvents.HeightMap2); 
    String Map = R.GetModel().SerializeRelativeMap; 
    RelativeMap.writeUTF(Map); 
    RelativeMap.Send(Socket);  
} 

堆棧跟蹤:

java.lang.NullPointerException 
    at messages.outgoing.rooms.LoadMapsMessageComposer.Compose(LoadMapsMessageComposer.java:30) 
    at messages.incoming.rooms.LoadMapsMessageEvent.run(LoadMapsMessageEvent.java:28) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

LoadMapsMessageComposer.java:30是具有

行HeightMap.writeUTF(R.GetModel()的GetMap());

+0

我們需要看到堆棧跟蹤和調用代碼。這看起來很好,我懷疑問題在別處。 – chrylis

+0

我更新了帖子,以便您可以看到它的來源,我一直試圖這樣做,並不知道爲什麼它不起作用。 – user2331349

+3

和堆棧跟蹤。請注意,您似乎正在使用C#命名,並且任何嘗試閱讀您的代碼的Java開發人員都會感到困惑。在Java中,約定是使用小寫字母來表示成員名稱(方法和變量)。我懷疑你的* actual * NPE發生在你的'R.GetModel()'調用中,因爲如果地圖中沒有該項的入口,則'byID'將返回'null'。 – chrylis

回答

1

的問題是,雖然你可能有幾個房間添加到您的地圖,你具有對應於currentRoomId一個房間。這意味着get(id),因此byID正在返回null,然後您嘗試調用該值null上的方法。

+0

謝謝我終於明白了這一點,謝謝你的幫助! – user2331349

相關問題