数週間前、私は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でこのメソッドを呼び出さないことがあるので、アンカーとホルダーは定義されていません...しかし、それは可能ですか?私は例外を説明することができる他の理由を見つけることができません。
あなたが私を助け、私の言語の間違いを残念に思っています、タウ。
しかし、ACTION_MOVEの前に常にACTION_DOWNがある場合、ACTION_DOWNのアンカーとホルダーが割り当てられているため、NPEをスローしないでください。さらに、これらの変数はACTION_MOVEで割り当てが解除されていないので、ACTION_UPでそれらにアクセスするとNPEも送出されません。途中で例外が数回だけスローされたことに注意してください。 – Towe
スタックトレースは、NPEが 'GameView'クラスの166行目のonTouchEvent()メソッドでスローされたことを示しています。コードスニペットの対応する行はどれですか? – matsev
私は初心者ですので、この番号がソースコードの行にあることを知らなかった...とにかく、166行目に 'holder.x = e.getX();'と170行目(いくつかのNPEも投げられた)には 'float length = PointF.length(holder.x-anchor.x、holder.y-anchor.y);'が含まれています。これは、MotionEvent.ACTION_DOWNでonTouchEvent()が実行されないことがある(または一部のデバイスで)ことを意味します。今私はあなたの助けを借りて、私の問題を解決することができます。 – Towe