Array NullPointerException в системе частиц - PullRequest
1 голос
/ 05 августа 2011

Я работаю над системой частиц для игры, над которой я начинаю работать.Я наткнулся на 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 ]

4 голосов
/ 05 августа 2011

Вы не инициализировали массив allParticles. И даже если вы его инициализируете,

allParticles=new ParticleSystem[10];

тогда вы все равно не сможете получить доступ к элементу allParticles[allParticles.length], так как индекс массива от 0 до allParticles.length-1.

Итак, у вашего кода две проблемы.

0 голосов
/ 05 августа 2011

Вы можете использовать LinkedList, потому что связанный список является динамической структурой данных, тогда как массивы являются статическими.

Чтобы по-прежнему использовать массивы, либо вы должны заранее знать, сколько элементов вы введете в массив для его инициализации, либо вам придется инициализировать его очень большим числом.Но это плохой подход в разработке программного обеспечения.

0 голосов
/ 05 августа 2011

Вы получаете исключение от вызова .length для всех частиц.Вы должны инициализировать массив в первую очередь.Даже если бы это работало, вызов allParticles [allParticles.length] был бы вне границ, потому что массив индексируется от 0 до length-1.

0 голосов
/ 05 августа 2011

Вы используете allParticles.length, но вы ни к чему не инициализировали массив.Ваш массив в настоящее время указывает на null.

Я думаю, что вы пытаетесь достичь, это расширить ваш массив, когда вам нужно вставить что-то новое, но поскольку массивам требуется непрерывная память, вы не можете изменить ее длину во время выполнения,Попробуйте использовать ArrayList вместо этого.Он работает как расширяемый массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...