用户报告在我的AlertDialog:的onClick
行发生NullPointerException
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();
因此,错误根源于160行的android.internal.app.AlertController
:
((DialogInterface.OnClickListener) msg.obj).onClick(mDialog.get(), msg.what);
根据我的猜测,mDialog
在这里是空的,但这怎么可能发生呢?从实现中,我们了解到对话框存储在一个弱引用中:
private WeakReference<DialogInterface> mDialog;
在用户按下肯定对话框按钮之前,对话框是否可能被垃圾收集?我发现这个非常令人困惑
StackTrace:
java.lang.NullPointerException
at com.myapp.android.NewActivity$5.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));
如果不是复制/粘贴问题,您的问题一定在这里:
mButton = new CustomButton((CustomButton) findViewById(R.id.goButton));
这是一个错误的编码,也不一定是:
mButton = new CustomButton(this);
这代表上下文,或者可能没有参数。或者它必须是这样的:
mButton = (CustomButton)findViewById(R.id.goButton);
不知道这是否是唯一的问题,但我必须展示代码,不好作为注释。