2013-04-14 3 views
-1

String 유형의 키와 LinkedList 유형의 값 (자체가 Sprite 유형 임)을 TreeMap에 삽입하려고합니다. 그러나 내 코드가 put() 메서드를 호출하면 null 포인터 예외가 발생하고 이유를 파악할 수 없습니다. 여기 TreeMap 및 제네릭을 사용하는 Null 포인터 예외

My entire class can be found here. But for brevity, I've narrowed it down to the problem parts below.

(나는 자바 7 사용하고 내 트리 맵 선언입니다, 그래서 다이아몬드를 좋아한다.

TreeMap<String, LinkedList<Sprite>> paneSprites = new TreeMap<>(); 

여기 내 방법의 일부입니다 (나머지는 서로 같은 일을 스프라이트와 또 다른 넣어() 메소드에서 나중에 다른 예외를 throw 여기에 넣어() 메소드를 주석.

public void initGUIControls() 
{ 
    canvas = new RambleOnPanel(this, (RambleOnDataModel)data); 
    LinkedList<Sprite> spriteList = new LinkedList<>(); 

    //Sprite for Welcome Pane 
    SpriteType st = new SpriteType(settings.WELCOME_BACKGROUND_TYPE); 
    BufferedImage img = loadImage(settings.WELCOME_IMAGE_PATH); 
    st.addState(settings.DEFAULT_STATE, img); 
    st.addState(settings.INVISIBLE_STATE, img); 
    int x = 0; 
    int y = 0; 
    int vX = 0; 
    int vY = 0; 
    Sprite s = new Sprite(st,x,y,vX,vY, settings.DEFAULT_STATE); 
    spriteList.add(s); 
    guiButtons.put(st.getSpriteTypeID(), s); 

    //put sprite types for this pane in the hash map and clear the list 
    getPaneSprites().put(settings.WELCOME_PANE_TYPE, spriteList); //EXCEPTION THROWN HERE 
    spriteList.clear(); 

    //Sprites for Select Account Pane 

또한, 여기에 사용되는 모든 문자열은 인스턴스화 다른 클래스에서 당신은 라인에 NullPointerException이 두 가지 옵션이 있습니다

package ramble_on; 

public class Settings 
{ 
//Game Settings 
public final String APP_TITLE = "Ramble On!"; 
public final int FRAME_RATE = 30; 
public final int GAME_HEIGHT = 700; 
public final int GAME_WIDTH = 1200; 

//Sprite States 
public final String INVISIBLE_STATE = "INVISIBLE STATE"; 
public final String DEFAULT_STATE = "DEFAULT STATE"; 

//Pane Types 
public final String WELCOME_PANE_TYPE = "WELCOME PANE TYPE"; 
public final String SELECT_ACCOUNT_PANE_TYPE = "SELECT ACCOUNT PANE TYPE"; 
public final String CURRENT_ACCOUNT_PANE_TYPE = "CUTTENT ACCOUNT PANE TYPE"; 

//Sprite Types 
public final String WELCOME_BACKGROUND_TYPE = "WELCOME BACKGROUND TYPE"; 
public final String SELECT_ACCOUNT_BACKGROUND_TYPE = "SELECT ACCOUNT TYPE"; 
public final String NEW_USER_BUTTON_TYPE = "NEW USER BUTTON TYPE"; 
public final String CURRENT_ACCOUNT_BACKGROUND_TYPE = "CURRENT ACCOUNT BACKGROUND TYPE"; 
public final String LARGE_RETURN_BUTTON_TYPE = "LARGE RETURN BUTTON TYPE"; 

//Sprite Image paths 
public final String IMAGES_PATH = "./data/images/"; 

public final String WELCOME_IMAGE_PATH = IMAGES_PATH + "welcome.png"; 
public final String SELECT_ACCOUNT_BACKGROUND_IMAGE_PATH = IMAGES_PATH + "selectAccount.png"; 
public final String NEW_USER_BUTTON_PATH = IMAGES_PATH + "newUser.png"; 
public final String Current_Account_SCREEN_BACKGROUND_IMAGE_PATH = IMAGES_PATH + "currentAccount.png"; 
public final String LARGE_RETURN_BUTTON_IMAGE_PATH = IMAGES_PATH + "newUser.png"; 

} 
+0

getPaneSprites()는 무엇입니까? 아마 null을 돌려 준다 – giorashc

+0

또는, getPaneSprites()는 실제로 가리키는 에러 라인상에서 잘못 될 가능성이있는 유일한 것을 돌려주는 null를 돌려주는 경우가 있습니다. –

답변

1

다음과 같이

getPaneSprites() (settings.WELCOME_PANE_TYPE, spriteList)를 넣습니다.;

  1. getPaneSprited()는 널 (null)
  2. settings.WELCOME_PANE_TYPE는 당신이 GET 호출 및 두 개의 서로 다른 라인에 넣어 나눌 수 1 있는지 확인하려면

null의 반환합니다. getter가 null을 반환하면 디버그합니다.

트리 맵 키는 null이 아니어도됩니다. 제네릭이 일단 컴파일되면 형식 지우기로 인해 제네릭이 사라지기 때문에 제네릭과 아무 관련이 없습니다.

+0

첫 번째 옵션 인 것 같습니다. 그러나 이유는 확실하지 않습니다. 클래스의 선언적 부분에서 새로운 TreeMap으로 선언했습니다. 내 게시물을 편집하고 질문에 전체 수업을 추가하겠습니다. – audiFanatic

+0

http://pastebin.com/0M7ZJy6e – audiFanatic

+0

이유는 모르겠지만 LinkedList와 함께 선언적 부분이 아니라 내 메서드의 맨 위에 TreeMap을 초기화하고 해결했습니다! 감사! – audiFanatic