我一直在尝试在JAVA中编写一个新类,我使用Map和HashMap将信息转发到不同的类,而不是在每个类中本地声明Map。
我创建了一个新类“GetRoom.java”,它有4种不同的方法:
代码如下:
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函数,那么它将返回Room 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 :(得分:1)
问题在于,虽然您可能会在地图中添加多个房间,但 的房间与currentRoomId
相对应。这意味着get(id)
并因此byID
正在返回null
,然后您尝试在null
值上调用方法。