来自android市场的NullPointerException报告

时间:2011-05-12 13:02:29

标签: 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.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,而不检查它是否为空。没有xml文件中包含android:onclick,因此它不会尝试调用错误的函数或类似的东西。我尝试比较给予android源代码的行,但它们似乎没有直接匹配,并且读取命名方法的来源并没有帮助我。 (免责声明:我只使用Java几个月。)

任何人都知道我应该检查什么?


ETA:这是我有一个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()是

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);,问题就会消失。

2 个答案:

答案 0 :(得分:2)

在HTC Desire HD上,触摸带有setInputType(InputType.TYPE_CLASS_NUMBER)设置的TextView会出现抛出NullPointerException。保留该设置可以防止崩溃,但需要手动输入过滤(这在我的情况下不是问题,但可能在其他人的情况下)。不是一个好的解决方案,但仍然是一个解决方案。

答案 1 :(得分:0)

解决方案不是将“setInputType”与 TextView 一起使用。无论如何,您不需要TextView的输入类型过滤,因为它们仅用于显示文本。 只有EditText 需要输入类型(并且有效)。我在4.2以下的Android版本中遇到了同样的问题。

缺点是,在textview上应用输入类型“password”实际上是有意义的,因为它掩盖了密码,这可能是预期的(在我的情况下)。但是这会在触摸textview时导致崩溃。