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

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()应该始终返回非null值,对吗?



ETA2我已经在HTC Desire HD上遇到了同样的错误,但是如果不回到我的代码中,它似乎会崩溃—立即在onClick内设置断点不会捕获任何错误。



ETA3如果我注释掉tvNumber.setInputType(InputType.TYPE_CLASS_NUMBER);,问题就消失了。

最佳答案

在HTC Desire HD上,触摸设置了setInputType(InputType.TYPE_CLASS_NUMBER)的TextView似乎会引发NullPointerException。保留该设置可以防止崩溃,但是必须进行手动输入过滤(在我看来,这不是问题,但可能是其他人的问题)。这不是一个好的解决方案,但是还是一个解决方案。

07-24 09:37
查看更多