Java 来自android market的NullPointerException报告

Java 来自android market的NullPointerException报告,java,android,nullpointerexception,Java,Android,Nullpointerexception,用户提交了以下崩溃报告: 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

用户提交了以下崩溃报告:

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)(或模拟器)上重现它,错误报告也没有告诉我问题出在应用程序中的什么地方或在什么设备上(或用户是谁,以便我可以向他们询问导致问题的更多信息)。我在代码中找不到任何地方,在没有先检查文本视图是否为null的情况下,我显然试图通过findviewbyd使用文本视图。所有xml文件中都没有android:onclick,因此它不会试图调用类型错误的函数或类似的东西。我试着比较android源代码的行,但它们似乎不直接匹配,阅读命名方法的源代码对我没有帮助。(免责声明:我使用Java才几个月。)

有人知道我还应该检查什么吗


预计到达时间:这里是我唯一拥有touchlistener而不是clicklistener的地方:

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()是

这似乎是个问题,因为您不能调用null.length(),但tvNumber是在其文本设置为“”的情况下创建的,所以getText().toString()应该始终返回非null值,对吗


ETA2我在HTC Desire HD上也遇到了同样的错误,但它似乎在不返回代码的情况下崩溃了——在onClick中立即设置断点无法捕获任何内容



ETA3如果我注释掉
tvNumber.setInputType(InputType.TYPE\u CLASS\u NUMBER)问题消失。

在HTC Desire HD上,触摸设置了setInputType(InputType.TYPE\u CLASS\u NUMBER)的文本视图似乎会抛出NullPointerException。离开该设置可以防止崩溃,但需要手动输入过滤(这在我的情况下不是问题,但在其他人的情况下可能是)。这不是一个好的解决方案,但不是一个好的解决方案。

解决方案不是将“setInputType”与文本视图一起使用。文本视图不需要输入类型过滤,因为它们只用于显示文本输入类型仅适用于EditText(在那里它可以工作)。我对4.2以下的Android版本也有同样的问题


缺点是,在textview上应用输入类型“password”实际上是有意义的,因为它屏蔽了密码,这可能是有意的(在我的例子中就是这样)。但这会在触摸textview时导致崩溃。

看起来更像是事件处理程序为空。您是否将可能的空值传递给textview?不明显;我刚刚注意到我的SQLite db中的datetime字段没有像其他字段一样设置为not null,所以我会仔细检查是否为not null,但我也会在所有插入中将其设置为当前时间,因此它实际上不应该为null。处理程序本身不为null(这是允许的),相反,您在
onTouchEvent
中所做的事情导致了NPE——如果您没有覆盖TextView的
onTouchEvent
,那么组件中可能存在错误。你问过用户这是什么设备吗?不幸的是,google anonymise向android market报告,设备类型只是说“其他”。我不能和用户说话。我确实为我的删除按钮设置了一个OnTouchListener,但我返回true,这应该会消耗触摸,对吗?@Joseph,事实上,它说“平台”是另一个,而不是设备——设备一点也没有提到——但不管怎样,我都不知道。肯定是真的,谢谢你指出这一点。我们也遇到了同样的问题,多亏了你的回答,我们才能够重现这个错误。再次感谢!谢谢你的更新。我发现,通过在XML布局中指定android:inputType=“phone”与在代码中指定android:inputType=“phone”,解决了这个问题(TYPE\u CLASS\u phone也会崩溃)。
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);
  }
}