Android 源代码中的 AlertDialog NullPointerException

AlertDialog NullPointerException in Android source code

一位用户报告了 NullPointerException 发生在我的 AlertDialog 的 onClick 行:

new AlertDialog.Builder(this)
        .setTitle(getString(R.string.dialog_error))
        .setMessage(getString(R.string.create_failed_error))
        .setCancelable(false)
        .setPositiveButton(getString(R.string.dialog_got_it), new DialogInterface.OnClickListener() { 
            @Override
            public void onClick(DialogInterface dialog, int which) {  // #L286
                dialog.cancel();
                mButton.render();
            }
        })
        .create().show();

错误的根源在于 Line 160 上的 android.internal.app.AlertController:

((DialogInterface.OnClickListener) msg.obj).onClick(mDialog.get(), msg.what);

据我猜测 mDialog 在这里是空的,但这怎么会发生呢?从实现中我们了解到对话框存储在弱引用中:

private WeakReference<DialogInterface> mDialog;

是否有可能在用户按下肯定对话框按钮之前对话框被垃圾收集?我觉得这很混乱

堆栈跟踪:

java.lang.NullPointerException
at com.myapp.android.NewActivity.onClick(NewActivity.java:286)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)

按钮在 onCreate

中实例化
mButton = new CustomButton((CustomButton) findViewById(R.id.goButton));

如果不是 copy/paste 问题,您的问题一定在这里:

     mButton = new CustomButton((CustomButton) findViewById(R.id.goButton));

这是一个错误的编码,也不一定是:

     mButton = new CustomButton(this);

这里代表上下文,或者可能没有参数。或者它必须是这样的:

    mButton = (CustomButton)findViewById(R.id.goButton);

不知道这是否是唯一的问题,但我必须展示代码,不适合作为评论。