2013-03-19 2 views
0

У меня проблема с использованием массивов массивов объектов или просто массивов объектов, и я уверен, что это не относится к slick. Всякий раз, когда метод init запускается и переходит к блочной части, я получаю исключение из null-указателя. Я также уверен, что проблема в том, что я не декларирую объекты Block правильно. Пожалуйста, мне действительно нужна помощь.Проблемы с объявлением массивов массивов объекта Java

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; 
    } 
} 

ответ

1

Вы никогда не создать экземпляр 2Dblock массива, в результате NPE то вы пытаетесь присвоить переменной здесь

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

Вы можете объявить массив таким образом:

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

спасибо. Ты единственный, кто ответил мне без снисходительного отношения. –

3

You» никогда не инициализируется сама block - она ​​всегда будет иметь значение null. Вам нужно:

block = new Block[13][13]; 

в методе init, или в конструкторе, или при объявлении переменной.

Несколько других примечаний:

  • Вы почти наверняка сделает ваши переменные private
  • Вы, вероятно, следует избегать жесткого кодирования число 13 довольно часто ... может у вас есть постоянные WIDTH и HEIGHT возможно?
  • Было бы более идиоматических объявить переменную как:

    private Block[][] block; 
    

    Это хранит всю информацию о типе о переменной вместе. «Массивная часть после имени переменной» действительно была там, чтобы сделать существующих программистов на C/C++ счастливыми, когда была введена Java.

Смежные вопросы