我已经找空指针几个小时了,感觉就像我一直盯着同一个屏幕浪费时间。
因此,我尝试打开 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/