2012-08-05 69 views
0

UPDATE我找到了解决方案:D感谢回复,但没有一个是真正的问题。我的问题是我在将它们添加到ArrayList后正在启动图像。Java ArrayList空指针

所以我有一个类命名瓷砖:

public class Tile { 
BufferedImage img; 
int x,y; 

public Tile(BufferedImage image, int x, int y) 
{ 
    this.x = x; 
    this.y = y; 
    this.img = image; 
} 

public int getX(){ 
    return x; 
} 
public int getY(){ 
    return y; 
} 
public BufferedImage getImage(){ 
    return img; 
} 
} 

然后我有保持图像的变量称为DATA_IMAGES类:

public class DATA_IMAGES { 
//terrain 
public static BufferedImage SNOW; 
public static BufferedImage GRASS; 
public static BufferedImage CAVE; 

//Entities 
public static BufferedImage TREE; 
public static BufferedImage player; 
public static int frame = 1; 
public static void initImages(){ 
    try { 
     player = ImageIO.read(new File("res/images/player/f1.png")); 
    } catch (IOException e) { 
     JOptionPane.showMessageDialog(null,"Can't Load Images "+e.getMessage(),"Fatal Error",JOptionPane.ERROR_MESSAGE); 
     System.exit(0); 
    } 
    try{ 
    //SNOW = new ImageIcon("res/images/snow.png").getImage(); 
    //CAVE = new ImageIcon("res/images/snow.png").getImage(); 
    GRASS = ImageIO.read(new File("res/images/grass.png")); 

    TREE = ImageIO.read(new File("res/images/tree.png")); 
    }catch(Exception ex){ 
     JOptionPane.showMessageDialog(null,"Can't Load Images","Fatal Error",JOptionPane.ERROR_MESSAGE); 
     System.exit(0); 
    } 



} 
} 

所以,当我在测试这一点,我有一个类,被称为Main:

public class Main extends JFrame { 
private static final long serialVersionUID = 6149918602875295087L; 
public static void main(String args[]){ 
    new Main(); 
} 
TileHelper tiles = new TileHelper(TileHelper.MAIN_LIST); 
public Main(){ 
    TileHelper.MAIN_LIST.add(new Tile(DATA_IMAGES.GRASS,100,100)); 
    DATA_IMAGES.initImages(); 
    setSize(640,480); 
    setResizable(false); 
    setTitle("Stranded"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setLocationRelativeTo(null); 

    setVisible(true); 

    createBufferStrategy(2); 
    GameLoop(); 
} 
public void GameLoop(){ 
    Thread gameloop = new Thread(){ 
     public void run(){ 
      while(true){ 
       RenderInit(); 
       try { 
        Thread.sleep(30); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 
    gameloop.start(); 
} 
public void RenderInit(){ 
    BufferStrategy buff = getBufferStrategy(); 
    Graphics g = buff.getDrawGraphics(); 

    g.clearRect(0, 0, getWidth(), getHeight()); 
    g.drawString("COOL TEXT", 100, 100); 

    Render(g); 

    g.dispose(); 
    buff.show(); 
    Toolkit.getDefaultToolkit().sync(); 
} 
public void Render(Graphics g){ 
    tiles.RenderAll(g); 
} 

} 

然后你可能会注意到有一个TileHelper类:

public class TileHelper { 
ArrayList<Tile> list; 
//Main list for adding tiles 
public static ArrayList<Tile> MAIN_LIST = new ArrayList<Tile>(); 

public TileHelper(ArrayList<Tile> list){ 
    this.list = list; 
} 

public void RenderAll(Graphics g){ 
    for(int i = 0; i < list.size(); i++){ 
     Tile t = new Tile(list.get(i).getImage(), list.get(i).getX(),list.get(i).getY()); 
     g.drawImage(list.get(i).getImage(),t.getX(),t.getY(),null); 
     System.out.println(t.getX()+" "+t.getY() + list.get(i).getImage().getHeight()); 
    } 
} 
} 

当你仔细看看你看到我打印出x值,y值和图像高度。我一直得到一个空指针,因为由于某种原因BufferedImage没有被设置?

问题我该如何解决这个问题,以便BufferedImage被识别,并且我没有得到空指针。

以下是错误只是柜面你需要它...

Exception in thread "Thread-3" java.lang.NullPointerException 
at com.survivalpixel.stranded.TileHelper.RenderAll(TileHelper.java:19) 
at com.survivalpixel.stranded.Main.Render(Main.java:60) 
at com.survivalpixel.stranded.Main.RenderInit(Main.java:53) 
at com.survivalpixel.stranded.Main$1.run(Main.java:35) 

回答

3

DATA_IMAGES.GRASS为空当你将它添加到TileHelper.MAIN_LIST。

添加GRASS图像后,您只需调用DATA_IMAGE.initImages(),以便GRASS图像在添加时为空。

DATA_IMAGES.initImages(); 
TileHelper.MAIN_LIST.add(new Tile(DATA_IMAGES.GRASS,100,100)); 
+0

我也投了这个答案。 – 2012-08-05 21:30:05

+0

就像我对上面这个问题所说的那样。同样适用于你 – 36redsoxfan 2012-08-05 21:42:57

5
public Main(){ 
    TileHelper.MAIN_LIST.add(new Tile(DATA_IMAGES.GRASS,100,100)); 
    DATA_IMAGES.initImages(); 
    // ... 

你需要周围交换这两行。在致电initImages()之前,DATA_IMAGES.GRASS仍然是null

(虽然严重,你想通了这一点很容易,如果你只是放置一个破发点,在构造函数的开始,并通过它加强。)

+1

这是正确的答案。 – 2012-08-05 21:29:42

+0

谢谢你,我在发布之前一字不漏地发现了这一点,但我仍然会给你信用 – 36redsoxfan 2012-08-05 21:42:18

0

你可能会更好,如果initImages是一个静态初始化块,而不是一个功能。因为它是你需要确保它在任何使用它初始化的变量之前被调用。你是否检查过这种情况?