Необъяснимое исключение в View.onTouchEvent () - PullRequest
0 голосов
/ 02 января 2012

Несколько недель назад я опубликовал свою первую игру в 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.

1 Ответ

0 голосов
/ 02 января 2012

anchor и holder присваиваются только значения в первом операторе if (с MotionEvent.ACTION_DOWN).Следовательно, и anchor, и holder не назначены (== null) в другом, если ветви (MotionEvent.ACTION_MOVE и MotionEvent.ACTION_UP) вызывают NPE при попытке назначить или получить доступ к holder.x, holder.y, привязке.х or anchor.y`.

...