3

一部のデバイスで Android アプリがクラッシュし、dispatchTouchEvent の実装内で NullPointerException が発生します。私のデバイスで実際にクラッシュが発生したことはありませんが、現場では 1 日に何度も発生しています。これは、自分の分析と Android デベロッパー コンソールの両方でクラッシュが発生しているためです。問題は、このクラッシュがどのように発生する可能性があるかを理解するのに苦労していることです. 関連するコードは次のとおりです (「CRASH HERE ->」によって NullPointerException がスローされるコード内の場所をマークしました)。

if (…)
{
    ...
}
else if (event != null)
{
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        motionStartX = event.getX();
        motionStartY = event.getY();
    }
    else if (event.getAction() == MotionEvent.ACTION_UP)
    {
        ...
        if (...)
        {
            ...
        }
        else if         (event != null && event.getPointerCount() > 0 &&
 /*** CRASH HERE -> ***/(Math.abs(motionStartX - event.getX()) > 5 ||
                         Math.abs(motionStartY - event.getY()) > 5))
        {
            ...
        }
    }
}

私の理解では、NullPointerException がスローされる唯一の方法は if eventisですがnull、そのすぐ上の行に、イベントにポインターがあるかどうか、さらにはeventパラノイドチェックを追加しました。nullそれでも、私はクラッシュしています。何かが足りない気がします。誰かがこれについて何か洞察を持っていますか?

4

1 に答える 1

0

0) 問題は、例外を処理していないことだと思います。

1) これら 2 つ (motionStartX、motionStartY) は、クラッシュ コードの上で宣言し、初期化 (設定) する必要があります。

2) 文字列を整数として使用していないなど、間違ったデータ型を処理していないことを確認します。

3) これがバグではなく例外である場合は、try Catch ステートメントを使用して例外を処理します。

4) Log.d("values on fun", "motionStartX = " + motionStartX " , motionStartY= " + motionStartY + " , event.getX() = " + event.getX() " , event.getY() = を使用" + event.getY()); Tp プリンティング値、値が存在する場合、ヌル ポイントはありません。

else if (event.getAction() == MotionEvent.ACTION_UP)
{
    try{ 
        Log.d("values on function", "motionStartX = " + motionStartX  " , motionStartY= " + motionStartY + " , event.getX() = " + event.getX()  " , event.getY() = " + event.getY());
        ...
        if (...){
            ...
        }
        else if         (event != null && event.getPointerCount() > 0 &&
        /*** CRASH HERE -> ***/(Math.abs(motionStartX - event.getX()) > 5 ||
                     Math.abs(motionStartY - event.getY()) > 5)){
                       ...
        }catch(Exception e){
          //Handle exceptions here, if they are exceptions not bugs in your code
       }
  }
于 2012-12-08T05:57:13.433 に答える