Android dispatchTouchEvent内部看似不可能的NullPointerException
我有一个Android应用程序,在我的dispatchTouchEvent实现中有一个NullPointerException,它在一些设备上崩溃。我从来没有在我的任何设备上看到过崩溃,但它每天在现场发生很多次,因为我在自己的分析和Android开发者控制台中都看到了崩溃。问题是,我很难弄清楚这次崩溃可能是如何发生的。以下是相关代码(我在代码中标记了“CRASH Here->”引发NullPointerException的位置): 根据我的理解,引发NullPointerException的唯一方法是如果Android dispatchTouchEvent内部看似不可能的NullPointerException,android,nullpointerexception,Android,Nullpointerexception,我有一个Android应用程序,在我的dispatchTouchEvent实现中有一个NullPointerException,它在一些设备上崩溃。我从来没有在我的任何设备上看到过崩溃,但它每天在现场发生很多次,因为我在自己的分析和Android开发者控制台中都看到了崩溃。问题是,我很难弄清楚这次崩溃可能是如何发生的。以下是相关代码(我在代码中标记了“CRASH Here->”引发NullPointerException的位置): 根据我的理解,引发NullPointerException的唯一
事件
是null
,但是,在它上面的一行,我添加了一些妄想检查事件
是否为null
,甚至事件是否有指针。尽管如此,我还是会崩溃。我觉得我错过了什么。有人对此有什么见解吗?0)我认为问题在于您没有处理异常
1) 这两个(motionStartX、motionStartY)应在崩溃代码上方声明,并且必须初始化(设置)
2) 检查您是否正在处理错误的数据类型,例如,您没有将字符串用作整数
3) 若异常不是bug,则使用try Catch语句处理异常
4) 使用Log.d(“乐趣上的值”,“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
}
}
阿米尔,谢谢你的回复。0). 当然,我可以把它放进一个try-catch块,然后用这种方式解决问题。但是,我想理解为什么会抛出NullPointerException。1). motionStartX和motionStartY在我引用的代码上方初始化。否则代码将无法编译。2). 我不确定将字符串作为整数处理将如何导致NullPointerException。你能说得更具体些吗?我可以使用什么字符串作为整数,在什么上下文中?由于Java是类型化的,这类东西通常很难通过编译器。3). 与0.4相同)。我尝试过类似于您建议的记录值。首先,正如我在问题中提到的,我不能在我的设备上复制这个,所以Log.d没有帮助。第二,我确实添加了关于这方面的分析,以了解发生了什么,但它显示这里使用的任何东西都不是空的。如果您无法在您的设备和模拟器上找到问题。你能找出是什么类型的设备或特定设备导致了这个问题(客户/消费者的任何回应),可能是硬件问题或某些特定设备的配置问题。正如我在问题中所说,我无法在我的设备上重现这个问题,所以我看不出我的logcat输出有什么用处。
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
}
}