2015-05-24 42 views
0

我一直在寻找空指针几个小时,感觉就像我一直在浪费盯着同一屏幕。Slick2d地图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); 

这是因为你”如果你调用构造函数,只重新分配一个值给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