2012-01-02 6 views
0

数週間前、私はAndroidマーケットで最初のゲームを公開しました。ベータテスト中にすべてが大丈夫だったが、最近私はこのようないくつかのエラーを受信しました:ここ View.onTouchEvent()の不可解な例外

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でこのメソッドを呼び出さないことがあるので、アンカーホルダーは定義されていません...しかし、それは可能ですか?私は例外を説明することができる他の理由を見つけることができません。

あなたが私を助け、私の言語の間違いを残念に思っています、タウ。

答えて

0

anchorおよびholderには、最初のif文(MotionEvent.ACTION_DOWNを持つもの)の値のみが割り当てられます。 割り当て又はアクセスholder.xしようとする枝(MotionEvent.ACTION_MOVEMotionEvent.ACTION_UP)はNPEを引き起こす場合したがって、anchor及びholder両方が他の他に(== null)割り当てられていない、holder.y, anchor.x or anchor.y`。

+0

しかし、ACTION_MOVEの前に常にACTION_DOWNがある場合、ACTION_DOWNのアンカーとホルダーが割り当てられているため、NPEをスローしないでください。さらに、これらの変数はACTION_MOVEで割り当てが解除されていないので、ACTION_UPでそれらにアクセスするとNPEも送出されません。途中で例外が数回だけスローされたことに注意してください。 – Towe

+0

スタックトレースは、NPEが 'GameView'クラスの166行目のonTouchEvent()メソッドでスローされたことを示しています。コードスニペットの対応する行はどれですか? – matsev

+0

私は初心者ですので、この番号がソースコードの行にあることを知らなかった...とにかく、166行目に 'holder.x = e.getX();'と170行目(いくつかのNPEも投げられた)には 'float length = PointF.length(holder.x-anchor.x、holder.y-anchor.y);'が含まれています。これは、MotionEvent.ACTION_DOWNでonTouchEvent()が実行されないことがある(または一部のデバイスで)ことを意味します。今私はあなたの助けを借りて、私の問題を解決することができます。 – Towe

関連する問題