2014-02-22 1 views
0

Java에서 새 클래스를 코딩하려고 시도했지만 Map 및 HashMap을 사용하여 모든 클래스에서 맵을 로컬로 선언하지 않고 다른 클래스에 정보를 전달합니다.지도 및 다른 클래스를 사용하여 NullPointerException

나는 새로운 클래스 4 개 가지 방법이있다 "GetRoom.java"만들었습니다

  • 무효 addRoom (INT ID를 룸 룸)
  • byID (INT 아이디)
  • 부울 containsID (INT 아이디)
  • doIexist()
  • 다음과 같이

코드는 : 나는 다른 클래스의 byID 기능을 사용하는 경우는, 반면, NullPointerException이 반환됩니다 내가 다음 doIexist 기능을 사용하는 경우는 룸 ID 5를 반환합니다

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); 
} 

. 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에서 규칙은 멤버 이름 (메서드 및 변수)에 소문자로 시작하는 문자를 사용하는 것입니다. 나는 당신의 실제 NPE가'R.GetModel()'호출에서 발생하고 있다고 의심한다. 왜냐하면'byID'는 그 키에 대한 맵 엔트리가 없다면'null'을 반환 할 것이기 때문이다. – chrylis

답변

1

문제는 당신이있을 수 있습니다 동안 여러 객실은지도에 추가 한, 당신은하지이 currentRoomId에 해당하는 공간이 할 입니다. 즉 get(id)byIDnull을 반환하고 그 다음에 null 값의 메서드를 호출하려고합니다.

+0

감사합니다. 나는 결국 이것을 알아 냈습니다. 당신의 모든 도움에 감사드립니다! – user2331349