Slick2d 地图 NullPointerException

Slick2d Map NullPointerException

找了几个小时的空指针,感觉一直盯着同一个屏幕发呆。

所以,我试图打开一个 SpriteSheet 并从中获取图像 sheet,不幸的是,我尽了最大的努力 returns 出错了。

我认为地图是问题所在;我有一张地图,记录了精灵的标题和目录 sheet。当我尝试访问指定的 SpriteSheet 时,它 returns 一个 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;
        }
    }

}

没有看到堆栈跟踪,我猜测问题出在这一行:

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

这是因为如果您调用构造函数,您只是为 sprites 赋值,所以如果您在调用构造函数之前调用此静态方法,您将得到一个 NullPointerException构造函数。

您可以像这样为静态字段赋值:

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

然后删除构造函数中的赋值。

您可能还需要考虑将静态字段设为私有和最终,以尽量减少可见性,并避免意外重新分配。

如果您想将 Tiles.png 精灵 sheet 放入那些静态地图中,您可以使用静态初始化块来实现:

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