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;
    }

mPopupしたがって、あなたの NPE はwhich is private AlertDialogof DialogPopup(private class of )によって引き起こされますSpinner。おそらく、クリックしたときにスピナーのオプションを表示するダイアログです。mPopupnull at とは異なるものにのみ設定されますDialogPopup.show()。そのメソッドはSpinner.performClick()、スピナーがクリックされたときに呼び出されます。

しかし、これは奇妙な部分です。スタック トレースは の項目mPopupがクリックDialogPopupされたときのようですOnClickListener。したがって、その時点で mPopup は null であってはなりません。しかし、DialogPopup.dismiss()それがnullの場合。

それを説明できるものは何ですか?これが私の仮説です。まあ、サルは通常かなり速いです。実際のユーザーよりも高速です。mPopup が最初の項目によって実際に閉じられる前に、2 つの項目をクリックできる可能性がありますDialogPopup.onClick()。したがって、 へDialogPopup.dismiss()の 2 つの呼び出しがあり、2 番目の呼び出しで NPE が発生します。

だからここに私の結論があります:

  • 内部クラスのみを扱っており、コードはクラッシュしたコードをトリガーする責任を負わないため、これは Android プラットフォームのバグである可能性が非常に高くなります。
  • これを修正するには、何が起こっているのかを完全に理解するために、Eclipse で再現およびデバッグできる必要があります。スピナー コードにステップ インするには、Android プラットフォーム コードをダウンロードする必要があります。または、Spinner コードにログを記録して Jelly Beans をビルドし、携帯電話をフラッシュする (または Framework.jar を置き換える) こともできます。
  • 私の仮説が正しければ、Eclipse を使用したデバッグは役に立ちません。問題をデバッグするにはログが必要です。しかし、私の仮説が正しければ、心配する必要はないと思います。通常のユーザーは、それほど速くクリックすることはほとんどできません。
  • Android 関係者に if-null チェックを行うようにアドバイスできます。ただし、本当の根本原因を見つけてからです。そうしないと、問題を隠すことになります
于 2012-09-08T02:45:51.920 に答える