2011-05-12 222 views
1

用户提交以下崩溃报告: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的,银河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()应始终返回非空值,对?


ETA2我已经成功地得到了HTC的Desire HD相同的错误,但它似乎没有要回我的代码崩溃 - 在里面的onClick立即设置断点,不赶什么。


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

+0

看起来更像是一个事件处理程序,为null。你是否可以将任何地方的null传递给textview? – 2011-05-12 13:05:47

+0

不明显;我刚刚注意到我的SQLite数据库中的datetime字段没有像其他的那样设置为null,所以我会仔细检查是否是这种情况,但是我也将它设置为当前时间在所有插入上,所以它应该从来没有实际* *为空。 – 2011-05-12 13:13:28

+1

处理程序本身不是null(这是允许的),而是你在'onTouchEvent'中做的事情正在导致NPE - 如果你没有重写TextView的'onTouchEvent',那么组件中可能存在一个错误。你问用户这是什么设备? – 2011-05-12 13:20:39

回答

2

在HTC Desire HD上,触摸带有setInputType(InputType.TYPE_CLASS_NUMBER)集合的TextView会引发NullPointerException异常。离开该设置可以防止崩溃,但需要手动输入过滤(这对我来说不是问题,但可能在其他人的情况下)。这不是一个好的解决方案,而是一个解决方案。

+0

肯定是这样,谢谢你指出这一点,我们遇到了同样的问题,并且能够通过你的答案重现错误。再次感谢! – 2011-10-05 12:59:18

+0

感谢您的更新。我发现通过在XML布局中指定android:inputType =“phone”,而不是在代码修正问题中(也与TYPE_CLASS_PHONE崩溃)。 – DustinB 2012-04-18 19:03:03

0

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

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