2011-05-12 221 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時會導致崩潰。