一位用户提交了以下崩溃报告:
java.lang.NullPointerException
at android.widget.TextView.onTouchEvent(TextView.java:7202)
at android.view.View.dispatchTouchEvent(View.java:3778)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:886)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:886)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:886)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:886)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:886)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1716)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1124)
at android.app.Activity.dispatchTouchEvent(Activity.java:2125)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1700)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1822)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:5068)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
我无法在我的任何测试手机(Xperia、HTC Desire、Galaxy S)(或模拟器)上重现它,并且错误报告没有告诉我问题出在应用程序的哪个位置或在什么设备上(或者用户是谁,这样我就可以向他们询问有关他们正在做什么导致它的更多信息)。我无法在代码中的任何地方找到我显然尝试通过 findViewById 使用 TextView 而不首先检查它是否为 null 的地方。所有 xml 文件中都没有 android:onclick
,因此它不会尝试调用错误类型的函数或类似的东西。我尝试比较给 android 源代码的行,但它们似乎并不直接匹配,并且阅读命名方法的源代码对我没有帮助。 (免责声明:我使用 Java 才几个月。)
有人知道我还应该检查什么吗?
预计到达时间:这是我唯一有触摸监听器而不是点击监听器的地方:
btnDelete.setOnTouchListener(new View.OnTouchListener()
{
public boolean onTouch(View v, MotionEvent meMotion)
{
int iAction = meMotion.getAction();
switch (iAction)
{
case MotionEvent.ACTION_DOWN:
if (false == bKeyPressed)
{
bKeyPressed = true;
deleteANumber();
}
mHandler.removeCallbacks(mDeleteTouch);
mHandler.postAtTime(mDeleteTouch, SystemClock.uptimeMillis()
+ BUTTON_DELAY);
break;
case MotionEvent.ACTION_UP:
bKeyPressed = false;
mHandler.removeCallbacks(mDeleteTouch);
break;
}
return true;
}
});
mDeleteTouch 在哪里
private final Runnable mDeleteTouch = new Runnable()
{
public void run()
{
// delete a number from the display
deleteANumber();
// then call self in BUTTON_DELAY ms, unless cancelled
mHandler.postAtTime(this, SystemClock.uptimeMillis() + BUTTON_DELAY);
}
};
deleteANumber() 是
protected void deleteANumber()
{
String strNumber = tvNumber.getText().toString();
// only remove a character if there is at least one:
if (strNumber.length() > 0)
{
strNumber = strNumber.substring(0, strNumber.length() - 1);
tvNumber.setText(strNumber);
}
}
这似乎是问题所在,因为您无法调用 null.length(),但创建 tvNumber 时其文本设置为“”,因此 getText().toString() 应始终返回非空值,对吧?
ETA2 我在 HTC Desire HD 上遇到了同样的错误,但它似乎没有返回我的代码就崩溃了——在 onClick 中立即设置断点并没有捕捉到任何东西.
ETA3 如果我注释掉 tvNumber.setInputType(InputType.TYPE_CLASS_NUMBER);
,问题就会消失。
最佳答案
在 HTC Desire HD 上,触摸设置了 setInputType(InputType.TYPE_CLASS_NUMBER) 的 TextView 似乎会引发 NullPointerException。离开该设置可以防止崩溃,但需要手动输入过滤(这对我来说不是问题,但可能是其他人的问题)。这不是一个好的解决方案,但仍然是一个解决方案。
关于java - 来自 android market 的 NullPointerException 报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5978370/