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