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是的,对!否则每当创建一个新对象时,数组都会设置为初始值。谢谢你纠正我。我已经用它更新了我的答案。谢谢!:)谢谢。这修复了它。所以我也必须初始化对象吗?