Несколько недель назад я опубликовал свою первую игру в Android Market. Во время бета-тестирования все было хорошо, но недавно я получил несколько ошибок, таких как:
java.lang.NullPointerException
at towe.papersoccer.GameView.onTouchEvent(GameView.java:166)
at android.view.View.dispatchTouchEvent(View.java:3819)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:936)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1907)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1159)
at android.app.Activity.dispatchTouchEvent(Activity.java:2086)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1891)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1811)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4632)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
at dalvik.system.NativeStart.main(Native Method)
Вот код метода, который выдает исключение:
// This class extends View
private PointF anchor;
private PointF holder;
public boolean onTouchEvent(MotionEvent e) {
if (e.getAction() == MotionEvent.ACTION_DOWN) {
anchor = new PointF(e.getX(), e.getY());
holder = new PointF(anchor.x, anchor.y);
return true;
} else if (e.getAction() == MotionEvent.ACTION_MOVE) {
holder.x = e.getX();
holder.y = e.getY();
return true;
} else if (e.getAction() == MotionEvent.ACTION_UP) {
float length = PointF.length(holder.x-anchor.x, holder.y-anchor.y);
if (length > 20) {
int row = 0;
int column = 0;
if (holder.x == anchor.x) {
if (holder.y > anchor.y) {
row = 1;
} else {
row = -1;
}
} else {
float a = (holder.y-anchor.y)/(holder.x-anchor.x);
if (holder.x > anchor.x) {
if (a > 1/2.5) row = 1;
else if (a < -1/2.5) row = -1;
if (a > -2.5 && a < 2.5) column = 1;
} else {
if (a > 1/2.5) row = -1;
else if (a < -1/2.5) row = 1;
if (a > -2.5 && a < 2.5) column = -1;
}
}
row += current.row;
column += current.column;
move(row, column, true); // As you can see in stack trace, this method doesn't throw the exception
}
anchor = null;
holder = null;
return true;
}
return false;
}
Понятия не имею, почему на некоторых устройствах этот метод вызывает исключение NullPointerException. Я полагаю, это потому, что иногда они могут не вызывать этот метод с MotionEvent.ACTION_DOWN, поэтому якорь и держатель не определены ... Но возможно ли это? Я не могу найти другие причины, которые могли бы объяснить исключение.
Надеюсь, вы мне поможете, и извините за мои языковые ошибки, Towe.