-5

オブジェクトの配列を作成する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]);
}

これはクラスBlockです。

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

}

さらに情報/コードを提供する必要がある場合はお知らせください

4

3 に答える 3

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

配列に存在するオブジェクトをインスタンス化するのを忘れました。したがって、nullポインタ例外を促しています

于 2013-02-27T05:58:48.600 に答える
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参照です。

于 2013-02-27T05:54:07.690 に答える
2

new Air (b[0]);(ブロック型の)8つのスロットを持つbという名前の空の配列を作成し、(空の)配列への参照を使用してオブジェクト(など)をインスタンス化しているように見えます。

Airのコンストラクターが、nullポインター例外の原因である可能性のあるnull引数を処理できない場合

b最初にいくつかのオブジェクトを入れてみてください

于 2013-02-27T05:55:38.407 に答える