使用Map和不同类的NullPointerException

时间:2014-02-22 15:23:00

标签: java map reference hashmap private

我一直在尝试在JAVA中编写一个新类,我使用Map和HashMap将信息转发到不同的类,而不是在每个类中本地声明Map。

我创建了一个新类“GetRoom.java”,它有4种不同的方法:

  • void addRoom(int id,Room room)
  • 会议室 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函数,那么它将返回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());

1 个答案:

答案 0 :(得分:1)

问题在于,虽然您可能会在地图中添加多个房间,但 的房间与currentRoomId相对应。这意味着get(id)并因此byID正在返回null,然后您尝试在null值上调用方法。