2013-02-27 8 views
-5

У меня возникла проблема с созданием массива объектов, но я получаю java.lang.NullPointerException, когда пытаюсь обратиться к нему.Java Object array java.lang.NullPointerException

это класс с проблемой.

public class Blocks { 
public static Block[] b = new Block[8]; 

public Blocks() throws IOException { 
    new Air (b[0]); 
    new Stone(b[1]); 
    new Grass(b[2]); 
    new Dirt (b[3]); 
} 

это классный блок.

public class Block { 
private Texture Texture = null; 
private int S = World.BLOCK_SIZE; 
private boolean hasTexture = true; 
private String texturePath = null; 

public void setTexture(String path) throws IOException { 
    this.texturePath = path; 
    Texture = TextureLoader.getTexture("PNG", new FileInputStream(new File(path))); 
} 

public void draw(int Xa, int Ya) { 

    GL11.glTranslatef(Xa, Ya, 0); 
    //GL11.glRotatef(0, 0, 1, 0); 
    //GL11.glRotatef(0, 1, 0, 0); 

    if(hasTexture) { 
    Texture.bind(); 

    GL11.glBegin(GL11.GL_QUADS); 
     GL11.glColor3f(0.5f, 0.5f, 1); 
     //GL11.glNormal3f(0, 0, 1); 
     GL11.glTexCoord2f(0, 0); 
     GL11.glVertex2f(0, 0); 
     GL11.glTexCoord2f(0, 1); 
     GL11.glVertex2f(0, S); 
     GL11.glTexCoord2f(1, 1); 
     GL11.glVertex2f(S, S); 
     GL11.glTexCoord2f(1, 0); 
     GL11.glVertex2f(S, 0); 

     GL11.glEnd(); 
    } 
} 

void hasTexture(boolean b) { 
    this.hasTexture = b; 
} 

} 

пожалуйста, дайте мне знать, если я должен предоставить дополнительную информацию/код

+0

Вы должны указать информацию об ошибке (сообщение об ошибке, строка, stacktrace) –

+0

Я думаю, что есть проблема с получением текстуры: Texture = TextureLoader.getTexture («PNG», новый FileInputStream (новый файл (дорожка))); – 2013-02-27 05:52:02

+0

texture is null, и когда вы пытаетесь работать с нулевым объектом, вы получаете NullPointerException. – 2013-02-27 05:52:41

ответ

3

сделать это таким образом

public class Blocks { 
public static Block[] b = new Block[8]; 

static { 
    // Instantiating the objects present in the array 
    for(int i=0; i<b.length; i++) 
     b[i] = new Block(); 
} 

public Blocks() throws IOException { 
    // Now you can access them 
    new Air (b[0]); 
    new Stone(b[1]); 
    new Grass(b[2]); 
    new Dirt (b[3]); 
} 

Вы забыли создать экземпляр объектов, присутствующих в массиве. Таким образом, это вызывает исключение нулевого указателя

+0

Не рекомендуется инициализировать статическое поле внутри конструктора. Лучшая идея - статический блок инициализатора или статический (ленивый) геттер. – skuntsel

+0

@ skuntsel Да, правильно! В противном случае всякий раз, когда создается новый объект, массив должен был бы установить начальное значение. Спасибо, что исправил меня. Я обновил свой ответ. Благодаря! :) – asifsid88

+0

Спасибо. это фиксировало это. так что мне нужно также инициировать объекты? – teenHack42

2

Для начала, вы можете смотреть на это: -

public static Block[] b = new Block[8]; 

public Blocks() throws IOException { 
    new Air (b[0]); 
    new Stone(b[1]); 
    new Grass(b[2]); 
    new Dirt (b[3]); 
} 

Вы не инстанцированы элементы массива. b[0], b[1], etc.. все еще null ссылки.

2

Казалось бы, вы создаете пустой массив с именем b с 8 слотами (блока типов), а затем создаете объекты (например, new Air (b[0]);), используя ссылки на (пустой) массив.

Если конструктор Air не может справиться с нулевым аргументом, который может быть источником вашего исключения нулевого указателя

Попробуй поместить некоторые объекты в b первого