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) {
// ...
}
找了几个小时的空指针,感觉一直盯着同一个屏幕发呆。
所以,我试图打开一个 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) {
// ...
}