java - Slick2d map NullPointerException

标签 java slick2d

我已经找空指针几个小时了,感觉就像我一直盯着同一个屏幕浪费时间。

因此,我尝试打开 SpriteSheet 并从该表中获取图像,不幸的是,在我的最佳尝试下,它返回了错误。

我相信 map 是问题所在;我有一个 map ,记录了 Sprite 表的标题和目录。当我尝试访问指定的 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;
        }
    }

}

最佳答案

如果没有看到堆栈跟踪,我会猜测问题发生在这一行:

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

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

您可能还需要考虑将静态字段设置为私有(private)字段和最终字段,以最大限度地减少可见性并避免意外重新分配。

如果您想将 Tiles.png Sprite 表放入这些静态 map 中,您可以使用静态初始化 block 来完成此操作:

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

关于java - Slick2d map NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30428882/

相关文章:

java - 反射 API 不显示具有注释的接口(interface)

java - 在呈现 Java 代码时提供帮助的程序?

java - 在另一个 Java VM 实例上启动线程并异步执行逻辑

java - 删除ArrayList中的对象本身

java - 如何在 Android 中运行 Google map 动画时禁用触摸检测

java - 运行 Java 代码时内存不足

java - LWJGL 和光滑的着色四边形不正确

java - 从指定索引处的数组中获取正确的值

Java slick2d 每 x 秒移动一个对象

java - lwjgl 和 slick - 旋转光滑纹理