Java 数组赋值产生NullPointerException

Java 数组赋值产生NullPointerException,java,android,arrays,nullpointerexception,Java,Android,Arrays,Nullpointerexception,我在为数组赋值时遇到问题,之前声明如下: Enemy[] enemies = new Enemy[100]; 我还有另一个变量定义了繁殖的敌人数量: int numEnemies = 0; 稍后,当触摸屏幕时,我(尝试)将此数组的成员动态分配给敌方对象: public void spawnEnemy() { Enemy enemy = new Enemy(...); ... initialise enemy ... enemies[numEnemies++] = enemy; // thi

我在为数组赋值时遇到问题,之前声明如下:

Enemy[] enemies = new Enemy[100];
我还有另一个变量定义了繁殖的敌人数量:

int numEnemies = 0;
稍后,当触摸屏幕时,我(尝试)将此数组的成员动态分配给敌方对象:

public void spawnEnemy() {
Enemy enemy = new Enemy(...);
... initialise enemy ...
enemies[numEnemies++] = enemy;  // this line causes NPE
}
我有这个堆栈跟踪:

01-24 02:00:28.509: E/AndroidRuntime(1394): FATAL EXCEPTION: UpdateThread
01-24 02:00:28.509: E/AndroidRuntime(1394): Process: com.example.menutest, PID: 1394
01-24 02:00:28.509: E/AndroidRuntime(1394): java.lang.NullPointerException
01-24 02:00:28.509: E/AndroidRuntime(1394): at com.example.menutest.GameScene.spawnEnemy(GameScene.java:333)
01-24 02:00:28.509: E/AndroidRuntime(1394):     at com.example.menutest.GameScene.initJoints(GameScene.java:325)
01-24 02:00:28.509: E/AndroidRuntime(1394):     at com.example.menutest.GameScene.loadLevel(GameScene.java:189)
01-24 02:00:28.509: E/AndroidRuntime(1394):     at com.example.menutest.GameScene.createScene(GameScene.java:80)
01-24 02:00:28.509: E/AndroidRuntime(1394):     at com.example.menutest.BaseScene.<init>(BaseScene.java:24)
01-24 02:00:28.509: E/AndroidRuntime(1394):     at com.example.menutest.GameScene.<init>(GameScene.java:32)
01-24 02:00:28.509: E/AndroidRuntime(1394):     at com.example.menutest.SceneManager$1.onTimePassed(SceneManager.java:118)
01-24 02:00:28.509: E/AndroidRuntime(1394):     at org.andengine.engine.handler.timer.TimerHandler.onUpdate(TimerHandler.java:94)
01-24 02:00:28.509: E/AndroidRuntime(1394):     at org.andengine.engine.handler.UpdateHandlerList.onUpdate(UpdateHandlerList.java:47)
01-24 02:00:28.509: E/AndroidRuntime(1394):     at org.andengine.engine.Engine.onUpdateUpdateHandlers(Engine.java:618)
01-24 02:00:28.509: E/AndroidRuntime(1394):     at org.andengine.engine.Engine.onUpdate(Engine.java:605)
01-24 02:00:28.509: E/AndroidRuntime(1394):     at org.andengine.engine.Engine.onTickUpdate(Engine.java:568)
01-24 02:00:28.509: E/AndroidRuntime(1394):     at org.andengine.engine.Engine$UpdateThread.run(Engine.java:858)
请添加Log.d()并查看所示内容:

Log.d("~~~","\n\n\n\n~~~ enemies="+enemies+"  enemy="+enemy);
enemies[numEnemies++] = enemy;  // this line causes NPE
我怀疑这是因为初始化的顺序,函数肯定是从构造函数或初始化器调用的

还要注意日志中的以下内容:

at com.example.menutest.GameScene.initJoints(GameScene.java:325)
at com.example.menutest.GameScene.loadLevel(GameScene.java:189)
at com.example.menutest.GameScene.createScene(GameScene.java:80)
at com.example.menutest.BaseScene.<init>(BaseScene.java:24)
at com.example.menutest.GameScene.<init>(GameScene.java:32)

好的,试试这个:在你得到NPE的那一行之前,加上

if (enemy == null) System.out.println("enemy is null");
if (numEntries == null) System.out.println("numEntries is null");
if (enemies == null) System.out.println("enemies is null");
enemies[numEnemies++] = enemy; // NPE

这会给你提供有用的信息吗?

我会解释发生了什么:

如何在调用实例构造函数之前调用实例方法?

class B {
  B() {
    m();
  }
  void m() {
    System.out.println("B.m()");
  }
}
class X extends B {
  int x = 8;
  void m() {
    System.out.println("X.m() x="+x);
  }
}

public class A {
    public static void main(String[] p) {
        X x = new X();
        x.m();
    }
}
让我们运行它:

$ javac A.java 

$ java A
X.m() x=0
X.m() x=8

这种错误行为在C++中是不可能的,在Basic类构造函数中,将调用B.M.(而不是X.M.)(./P>)。


构造函数B()在从构造函数X()执行任何代码之前被自动调用,因此方法X.m()在构造函数X()中的任何代码接收控制之前被调用。

请显示一个简短但完整的程序来演示此问题。我确信问题出在您没有显示的代码中-例如,如果您的初始化意外地发生在构造函数中的一个局部变量上,导致实例变量未初始化。编辑后,我可以看到数组
但它在哪里初始化?请确保您已初始化数组。请在代码中查找
antights=null
。初始化的
numemies
在哪里?您可能希望显示完整的代码部分,而不是多个单独的部分。现在很难分辨哪些是从哪里来的等等。您的变量范围可能是其中的一个重要因素。可能…:(我有点想问您为什么要使用本机数组而不是使用数组类。如果我尝试在NPE之前直接执行<代码>敌人=新的敌人[100 ];在SpAnnBeunyYe()中,它会重写现有成员吗?它会。请考虑使用ARARYLIST,看看它是否工作得更好。
class B {
  B() {
    m();
  }
  void m() {
    System.out.println("B.m()");
  }
}
class X extends B {
  int x = 8;
  void m() {
    System.out.println("X.m() x="+x);
  }
}

public class A {
    public static void main(String[] p) {
        X x = new X();
        x.m();
    }
}
$ javac A.java 

$ java A
X.m() x=0
X.m() x=8