【问题标题】:Java Object array java.lang.NullPointerException [closed]Java对象数组java.lang.NullPointerException [关闭]
【发布时间】:2013-02-27 05:49:36
【问题描述】:

我在创建对象数组时遇到问题,但是当我尝试向它解决某些问题时得到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;
}

}

如果我需要提供更多信息/代码,请告诉我

【问题讨论】:

  • 您应该提供错误信息(错误信息、行、堆栈跟踪)
  • 我认为获取纹理有问题:Texture = TextureLoader.getTexture("PNG", new FileInputStream(new File(path)));
  • texture 为 null,当您尝试使用 null 对象时,您会得到 NullPointerException
  • 对静态字段使用静态初始化块,或静态惰性 getter。并将对象正确分配给您的数组: b[0] = new Block()
  • 否决这一点并没有真正的帮助。是的,它可以改进,但没有必要在这个问题上大发雷霆。

标签: java arrays object


【解决方案1】:

这样做

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

您忘记实例化数组中存在的对象。所以提示空指针异常

【讨论】:

  • 在构造函数中初始化静态字段不是一个好主意。静态初始化块或静态(惰性)getter 会更好。
  • @skuntsel 对!否则,无论何时创建一个新对象,该数组都会设置为初始值。谢谢你纠正我。我已经用它更新了我的答案。谢谢! :)
  • 谢谢。这修复了它。所以我也必须初始化对象?
【解决方案2】:

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

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

先尝试将一些对象放入b

【讨论】:

    【解决方案3】:

    对于初学者,您可以查看以下内容:-

    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 引用。

    【讨论】:

      猜你喜欢
      • 2021-07-19
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      相关资源
      最近更新 更多