2012-09-08 21 views
0

我是java/android的新手,並試圖幫助開源項目。我決定我可以從嘗試修復錯誤中學到最多的東西,所以我一直在應用程序上運行Monkey,開始使用bugsense生成崩潰報告(我無法訪問play.google崩潰報告)。我一直遇到下面的崩潰,因爲它沒有確定應用程序在哪裏出現問題,我甚至不確定問題到底是什麼。我並不是要求逐行修復(儘管它是開源的),但是一些有用的提示將非常感謝。來自spinner.java:828的NullpointerException解僱

完成回購:https://github.com/rackspace/android-rackspacecloud 堆棧跟蹤+來源:http://pastebin.com/YkX7NvdD

Stacktrace: 
// CRASH: com.rackspace.cloud.android (pid 3330) 
// Short Msg: java.lang.NullPointerException 
// Long Msg: java.lang.NullPointerException 
// Build Label: google/takju/maguro:4.1.1/JRO03C/398337:user/release-keys 
// Build Changelist: 398337 
// Build Time: 1341437384000 
// java.lang.NullPointerException 
// at android.widget.Spinner$DialogPopup.dismiss(Spinner.java:828) 
// at android.widget.Spinner$DialogPopup.onClick(Spinner.java:862) 
// at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:924) 
// at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
// at android.widget.AbsListView.performItemClick(AbsListView.java:1086) 
// at android.widget.AbsListView.onKeyUp(AbsListView.java:2996) 
// at android.widget.ListView.commonKey(ListView.java:2196) 
// at android.widget.ListView.onKeyUp(ListView.java:2051) 
// at android.view.KeyEvent.dispatch(KeyEvent.java:2633) 
// at android.view.View.dispatchKeyEvent(View.java:7086) 
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1354) 
// at android.widget.ListView.dispatchKeyEvent(ListView.java:2026) 
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358) 
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358) 
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358) 
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358) 
// at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1358) 
// at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1892) 
// at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1369) 
// at android.app.Dialog.dispatchKeyEvent(Dialog.java:702) 
// at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1819) 
// at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3575) 
// at android.view.ViewRootImpl.deliverKeyEvent(ViewRootImpl.java:3531) 
// at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3113) 
// at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4153) 
// at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4132) 
// at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4224) 
// at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171) 
// at android.os.MessageQueue.nativePollOnce(Native Method) 
// at android.os.MessageQueue.next(MessageQueue.java:125) 
// at android.os.Looper.loop(Looper.java:124) 
// at android.app.ActivityThread.main(ActivityThread.java:4745) 
// at java.lang.reflect.Method.invokeNative(Native Method) 
// at java.lang.reflect.Method.invoke(Method.java:511) 
// at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
// at dalvik.system.NativeStart.main(Native Method) 
// 
** Monkey aborted due to error. 
Events injected: 5252 
:Sending rotation degree=0, persist=false 
:Dropped: keys=0 pointers=23 trackballs=0 flips=0 rotations=0 
## Network stats: elapsed time=47382ms (0ms mobile, 47382ms wifi, 0ms not connected) 
** System appears to have crashed at event 5252 of 10000 using seed 0 

回答

1

按照code I am seeing at GrepCode,我們有這樣的:

public void dismiss() { 
     mPopup.dismiss(); 
     mPopup = null; 
    } 

所以你的NPE由mPopup這是私人的AlertDialogDialogPopup引起(私人課程Spinner),可能是在單擊時顯示微調器選項的對話框。 mPopup僅在DialogPopup.show()處設置爲與null不同的值。該方法在Spinner.performClick()處被調用,即,當點擊微調器時。

但是,這是奇怪的部分。堆棧跟蹤似乎是在點擊mPopup的項目時,因爲DialogPopup設置爲其OnClickListener。所以在這一點上,mPopup不應該爲null。但是當DialogPopup.dismiss()它是空的。

有什麼可以解釋的?這是我的假設。那麼,猴子通常很快。比實際用戶更快。在mPopup被第一個DialogPopup.onClick()真正解僱之前,它可能會點擊兩個項目。所以我們有兩個電話給DialogPopup.dismiss(),第二個電話告誡NPE。

因此,這裏有我的結論:

  • 因爲我們正在與內部類只處理和你的代碼是不負責觸發崩潰的代碼,這是非常有可能的Android平臺的bug。
  • 爲了解決這個問題,你必須能夠在eclipse中重現和調試,以便充分理解發生了什麼。您需要下載Android平臺代碼以便能夠進入微調代碼。或者你可以把登錄的微調代碼和生成糖豆和閃爍您的手機(或更換framework.jar)
  • 如果我的假設是正確的,然後用ecplise不會幫助調試。您將需要日誌來調試問題。但如果我的假設是正確的,那麼我們認爲我們不應該擔心。普通用戶幾乎不能點擊這麼快。
  • 你可以建議Android的人做一個if-null檢查。但只有在找到真正的根本原因之後。否則,你會掩蓋問題