0

我是 java/android 新手,并试图帮助一个开源项目。我决定我可以从尝试修复错误中学到最多的东西,所以我一直在应用程序上运行 Monkey 以开始使用 bugsense 生成崩溃报告(我无权访问 play.google 崩溃报告)。我一直遇到下面的崩溃,由于它无法确定应用程序在代码中的哪个位置出现问题,我什至不确定到底是什么问题。我不是要求逐行修复(尽管它是开源的),但非常感谢一些有用的提示。

完整的回购:https ://github.com/rackspace/android-rackspacecloud Stacktrace + 来源: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
4

1 回答 1

1

根据我在 GrepCode 看到的代码,我们有这个:

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

因此,您的 NPE 是由mPopup哪个是私有AlertDialogDialogPopup(私有类Spinner)引起的,可能是单击它时显示微调器选项的对话框。mPopup仅设置为与 null at 不同的值DialogPopup.show()。该方法在Spinner.performClick(),即单击微调器时调用。

但这是奇怪的部分。堆栈跟踪似乎mPopup是单击的项目时,因为DialogPopup设置为它的OnClickListener. 因此,此时 mPopup 不应为空。但是当DialogPopup.dismiss()它为空时。

这有什么可以解释的?这是我的假设。好吧,猴子通常很快。比实际用户更快。在 mPopup 被第一个真正解雇之前,它可能能够单击两个项目DialogPopup.onClick()。所以我们有两个调用DialogPopup.dismiss(),第二个调用 NPE。

所以这是我的结论:

  • 因为我们只处理内部类,而你的代码不负责触发崩溃的代码,所以这很可能是一个 Android 平台错误。
  • 要解决此问题,您必须能够在 Eclipse 中重现和调试,以便完全了解正在发生的事情。您需要下载 Android 平台代码才能进入微调器代码。或者,您可以登录 Spinner 代码并构建 Jelly Beans 并刷新您的手机(或替换 framework.jar)
  • 如果我的假设是正确的,那么使用 ecplise 进行调试将无济于事。您将需要日志来调试问题。但如果我的假设是正确的,那么我们认为我们不应该担心。普通用户几乎无法点击这么快。
  • 您可以建议 Android 人员进行 if-null 检查。但只有在你找到真正的根本原因之后。否则,你将掩盖问题
于 2012-09-08T02:45:51.920 回答