我一直在嘗試在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());
我們需要看到堆棧跟蹤和調用代碼。這看起來很好,我懷疑問題在別處。 – chrylis
我更新了帖子,以便您可以看到它的來源,我一直試圖這樣做,並不知道爲什麼它不起作用。 – user2331349
和堆棧跟蹤。請注意,您似乎正在使用C#命名,並且任何嘗試閱讀您的代碼的Java開發人員都會感到困惑。在Java中,約定是使用小寫字母來表示成員名稱(方法和變量)。我懷疑你的* actual * NPE發生在你的'R.GetModel()'調用中,因爲如果地圖中沒有該項的入口,則'byID'將返回'null'。 – chrylis