dispatchTouchEvent 中看似不可能的 NullPointerException

Posted

技术标签:

【中文标题】dispatchTouchEvent 中看似不可能的 NullPointerException【英文标题】:Seemingly impossible NullPointerException inside dispatchTouchEvent 【发布时间】:2012-11-26 07:49:23 【问题描述】:

我有一个 android 应用程序在我的 dispatchTouchEvent 实现中在某些设备上崩溃并出现 NullPointerException。我实际上从未在我的任何设备上看到过崩溃,但它每天在现场发生很多次,因为我在自己的分析和 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))
        
            ...
        
    

根据我的理解,如果eventnull,则可能引发 NullPointerException 的唯一方法,但是,在它上面的行上,我添加了一些偏执检查 eventnull 甚至那个事件有指针。尽管如此,我还是遇到了崩溃。我觉得我错过了什么。有人对此有任何见解吗?

【问题讨论】:

正如我在问题中所说,我无法在我的设备上重现此问题,因此我看不出我的 logcat 输出会有什么用处。 【参考方案1】:

0) 我认为问题在于您没有处理异常。

1)这两个(motionStartX,motionStartY)应该在崩溃代码上面声明并且必须初始化(set),

2) 检查您没有处理错误的数据类型,例如您没有使用字符串作为整数。

3) 使用 try Catch 语句处理异常,如果这是异常不是错误

4) 使用 Log.d("values on fun", "motionStartX = " + motionStartX " , motionStartY= " + motionStartY + " , event.getX() = " + event.getX() " , event.getY () = " + event.getY()); Tp pring 值,如果值存在则没有空点,

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
       
  

【讨论】:

阿米尔,感谢您的回复。 0)。当然,我可以将其放入 try-catch 块中并以这种方式解决问题。但是,我想了解为什么会抛出 NullPointerException。 1)。 motionStartX 和 motionStartY 在我引用的代码上方初始化。否则代码将无法编译。 2)。我不确定将字符串作为整数处理会如何导致 NullPointerException。你可以说得更详细点吗?我可以使用什么字符串作为整数以及在什么上下文中使用?由于 Java 是有类型的,这种东西通常很难通过编译器。 3)。与 0 相同。 4)。我已经尝试过与您的建议类似的记录值。首先,正如我在问题中提到的,我无法在我的设备上重现它,所以 Log.d 无济于事。其次,我确实为此添加了分析以查看发生了什么,但它表明这里使用的所有内容都是空的。 如果您在您的设备和模拟器上找不到问题。你能找出是什么类型的设备或特定设备产生了这个问题吗(客户/客户的任何回复),可能是硬件问题或某些特定设备的配置问题

以上是关于dispatchTouchEvent 中看似不可能的 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

成功解决了一个看似不可能的问题~

如何在 dispatchTouchEvent 中检测 MotionEvent

SwipeRefreshLayout 报错 dispatchTouchEvent

Java编程思想看似5星推荐实际一点不适合初学者

事件分发机制:从onClick到dispatchTouchEvent

Activity的dispatchTouchEvent调用堆栈