粒子系统中的数组NullPointerException

时间:2011-08-05 04:03:03

标签: java android arrays list nullpointerexception

我正在为我开始研究的游戏开发一个自定义粒子系统。我第一次测试时遇到了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;
}

4 个答案:

答案 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是动态数据结构,而数组是静态的。

要仍然使用数组,您必须事先知道要在阵列中输入多少元素来初始化它,否则您必须将其初始化为非常大的数字。但这在软件设计中是一种糟糕的方法。