2015-05-24 2 views
0

Я искал нулевой указатель в течение нескольких часов, и мне кажется, что я пропал, глядя на тот же экран.Slick2d Map NullPointerException

Итак, я пытаюсь открыть SpriteSheet и получить изображение с этого листа, к сожалению, при моих лучших попытках он возвращает ошибку.

Я считаю, что Карта является проблемой; У меня есть карта, которая документирует заголовок и каталог листа спрайтов. Когда я пытаюсь получить доступ к указанному параметру SpriteSheet, он возвращает исключение NullPointerException.

В любом случае, получить к коду:

package main; 

import java.util.HashMap; 
import java.util.Map; 

import org.newdawn.slick.Image; 
import org.newdawn.slick.SlickException; 
import org.newdawn.slick.SpriteSheet; 

public class Resources { 

    public static Map<String, SpriteSheet> sprites; 
    public static Map<String, Image> images; 

    public Resources(){ 
     sprites = new HashMap<String, SpriteSheet>(); 
     images = new HashMap<String, Image>(); 

     try { 
      sprites.put("Tiles", getSpriteSheet("Tiles.png", 32, 32)); 
     } catch (SlickException e) { 
      e.printStackTrace(); 
     } 

    } 

    private static SpriteSheet getSpriteSheet(String image, int w, int h) throws SlickException{ 
     return new SpriteSheet("/res/" + image, w, h); 
    } 

    public static Image getImage(String image, int x, int y) throws SlickException{ 
     Image img = sprites.get("Tiles").getSubImage(x, y); 

     if(img != null){ 
      return img; 
     }else{ 
      System.out.println("ERROR LOADING IMAGE"); 
      return null; 
     } 
    } 

} 
+3

Пожалуйста редактировать свой вопрос и подать stracktrace –

ответ

2

Не видя трассировки стека, я собираюсь предположить, что эта проблема возникает на этой линии:

Image img = sprites.get("Tiles").getSubImage(x, y); 

Это потому, что вы» re только присваивая значение sprites, если вы вызываете конструктор, поэтому вы получите NullPointerException, если вы вызываете этот статический метод, прежде чем вы вызываете конструктор.

Вы можете присвоить значение для статических полей, как это:

public static Map<String, SpriteSheet> sprites = new HashMap<>(); 
public static Map<String, Image> images = new HashMap<>(); 

, а затем удалить задания в конструкторе.

Возможно, вы также захотите, чтобы статические поля были закрытыми и окончательными, чтобы минимизировать видимость и избежать случайного переназначения соответственно.

Если вы хотите поставить Tiles.png спрайт листа в этих статических карт, вы можете сделать это, используя статический инициализатор блок:

static { 
    try { 
    sprites.put("Tiles", getSpriteSheet("Tiles.png", 32, 32)); 
    } catch (SlickException e) { 
    // ... 
    } 
+0

хороший улов, я не сделал см. его –

+0

Что-то такое простое! Goddamit. – genfy

Смежные вопросы