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