我有一个Android应用程序在某些设备上崩溃,在我的dispatchTouchEvent实现中有一个NullPointerException。我从来没有真正看到崩溃发生在我的任何设备上,但它每天都会在现场发生多次,因为我在自己的分析和Android Developer控制台中都看到了崩溃。问题是我很难弄清楚这次崩溃是如何发生的。这是相关代码(我在代码中标记了“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
甚至事件都有指针。不过,我正在崩溃。我觉得我错过了什么。有没有人对此有任何见解?
答案 0 :(得分:0)
0)我认为问题是你没有处理异常。
1)这两个(motionStartX,motionStartY)应该在崩溃代码上面声明并且必须初始化(设置),
2)检查您是否处理了错误的数据类型,例如您没有使用字符串作为整数。
3)使用try Catch语句来处理异常,如果这是异常而不是bug
4)使用Log.d(“fun 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
}
}