我正在为我开始研究的游戏开发一个自定义粒子系统。我第一次测试时遇到了NullPointerException
。我想我知道为什么但我不知道如何解决它。以下是相关代码:
ParticleSystem[] allParticles;
@Override
public boolean onTouchEvent(MotionEvent me){
Random rand = new Random();
allParticles[allParticles.length] = new ParticleSystem(
rand.nextInt(10)+30,randomColor(),(int)me.getX(),(int)me.getY(), //this is 137
rand.nextInt(10)+5,rand.nextInt(10)+5);
return true;
}
错误:
08-04 20:53:27.579: ERROR/AndroidRuntime(16805): java.lang.NullPointerException 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at com.laytproducts.pixelinvaders.GamePanel.onTouchEvent(GamePanel.java:37) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at android.view.View.dispatchTouchEvent(View.java:3766) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:863) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1746) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1117) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at android.app.Activity.dispatchTouchEvent(Activity.java:2092) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1730) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at android.view.ViewRoot.handleMessage(ViewRoot.java:1794) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at android.os.Handler.dispatchMessage(Handler.java:99) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at android.os.Looper.loop(Looper.java:143) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at android.app.ActivityThread.main(ActivityThread.java:4701) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at java.lang.reflect.Method.invokeNative(Native Method) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at java.lang.reflect.Method.invoke(Method.java:521) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 08-04 20:53:27.579: ERROR/AndroidRuntime(16805): at dalvik.system.NativeStart.main(Native Method)
这可能真的不是很好的编码,所以这就是我需要一些帮助的原因。我认为这与我使用allParticles.length
作为添加系统的位置这一事实有关,是否有更好的方法来做到这一点?我已经尝试将其转换为ArrayList
然后执行.add
;它还给了我一个NullPointerException
,这也让我觉得它与第137行的其他部分有关。
解决
这样做了:
@Override
public boolean onTouchEvent(MotionEvent me){
Random rand = new Random();
for(ParticleSystem p : allParticles){
if(null == p){
p = new ParticleSystem(rand.nextInt(10)+30,randomColor(),
(int)me.getX(),(int)me.getY(),15,15);
Log.i("Pixel Invaders","ParticleSystem created: ");
break;
}
}
return true;
}
答案 0 :(得分:4)
您尚未初始化allParticles
数组。即使你初始化它,
allParticles=new ParticleSystem[10];
然后你仍然无法访问allParticles[allParticles.length]
元素,因为数组索引从0到allParticles.length-1
。
所以你的代码有两个问题。
答案 1 :(得分:0)
您正在使用allParticles.length
,但尚未将数组初始化为任何内容。您的数组当前指向null
。
我认为你想要实现的是在插入新内容时扩展数组,但由于Arrays需要连续内存,因此无法在运行时更改其长度。请尝试使用ArrayList
。它可以作为可扩展阵列使用。
答案 2 :(得分:0)
你在allParticles上调用.length获得了异常。您必须首先初始化阵列。即使那是有效的,调用allParticles [allParticles.length]也会超出范围,因为数组的索引从0到长度为1。
答案 3 :(得分:0)
您可以使用LinkedList,因为linkedlist是动态数据结构,而数组是静态的。
要仍然使用数组,您必须事先知道要在阵列中输入多少元素来初始化它,否则您必须将其初始化为非常大的数字。但这在软件设计中是一种糟糕的方法。