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))
...
根据我的理解,如果event
是null
,则可能引发 NullPointerException 的唯一方法,但是,在它上面的行上,我添加了一些偏执检查 event
是 null
甚至那个事件有指针。尽管如此,我还是遇到了崩溃。我觉得我错过了什么。有人对此有任何见解吗?
【问题讨论】:
正如我在问题中所说,我无法在我的设备上重现此问题,因此我看不出我的 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