在声明对象Java数组的数组时遇到问题

时间:2013-03-19 17:22:48

标签: java nullpointerexception 2d slick2d

我在使用对象数组的数组或只是对象数组时遇到问题,我很确定这与光滑无关。每当init方法运行并到达块部分时,我都会得到一个空指针异常。我也确定问题在于我没有正确地声明Block对象。我真的需要一些帮助。

import org.newdawn.slick.*;
import org.newdawn.slick.state.*;

public class Stages extends BasicGameState {
    LevelInfo level = new LevelInfo(1);
    Block block[][];
    public Stages(int state) {

    }
    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {
        level.init();
        for(int i = 0; i < 13;i++) {
            for(int j = 0; j < 13;j++) {
                block[i][j] = new Block(level.type[i][j]);
            }
        }

    }
    public void render(GameContainer gc, StateBasedGame sbg,Graphics g) throws SlickException {
        for(int i = 0; i < 13;i++) {
            for(int j = 0; j < 13;j++) {
                g.drawImage(block[i][j].image,j*60,i*60);
            }
        }
    }
    public void update(GameContainer gc, StateBasedGame sbg,int delta) throws SlickException {

    }
    public int getID() {
        return 2;
    }
}

2 个答案:

答案 0 :(得分:3)

您永远不会初始化block本身 - 它的值始终为null。你需要:

block = new Block[13][13];

init方法中,或在构造函数中,或在变量声明中。

其他几点说明:

  • 您几乎肯定会制作变量private
  • 你可能应该经常避免对数字13进行硬编码......你是否可能有WIDTHHEIGHT的常数?
  • 将变量声明为:

    更为惯用
    private Block[][] block;
    

    将变量的所有类型信息保存在一起。在引入Java时,“变量名后面的数组部分”确实让现有的C / C ++程序员感到高兴。

答案 1 :(得分:1)

您永远不会实例化2D block数组,导致NPE然后您尝试在此处分配变量

block[i][j] = new Block(level.type[i][j]);

你可以这样声明你的数组:

private Block block[][] = new Block[13][13];