Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java对象数组Java.lang.NullPointerException_Java_Arrays_Object - Fatal编程技术网

Java对象数组Java.lang.NullPointerException

Java对象数组Java.lang.NullPointerException,java,arrays,object,Java,Arrays,Object,我遇到了一个问题,我创建了一个对象数组,但是当我试图对它寻址时,我得到了一个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 D

我遇到了一个问题,我创建了一个对象数组,但是当我试图对它寻址时,我得到了一个
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;
}

}

如果我需要为初学者提供更多信息/代码,请告知我,您可以查看以下内容:-

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]等。
仍然是
null
引用。

看起来您正在创建一个名为b的空数组,其中包含8个插槽(类型为block),然后使用对(空)数组的引用实例化对象(例如
newair(b[0]);

如果Air的构造函数无法处理可能是null指针异常源的null参数

试着先把一些对象放到
b

这样做

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]);
}
公共类块{
公共静态块[]b=新块[8];
静止的{
//实例化数组中存在的对象

对于(int i=0;iYou应该提供错误信息(错误消息、行、堆栈跟踪),我认为获取纹理时存在问题:texture=TextureLoader.getTexture(“PNG”,new FileInputStream(new File(path)));纹理为null,当您尝试使用null对象时,会得到NullPointerExceptionUse static initializer block for static fields,或static lazy getter。并将对象正确分配给数组:b[0]=new block()将此向下表决到遗忘中并没有真正的帮助。是的,它可以改进,但不需要在这一点上大发雷霆。在构造函数中初始化静态字段不是一个好主意。静态初始值设定项块或静态(惰性)getter会是一个更好的主意。@skuntsel是的,对!否则每当创建一个新对象时,数组都会设置为初始值。谢谢你纠正我。我已经用它更新了我的答案。谢谢!:)谢谢。这修复了它。所以我也必须初始化对象吗?