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);
不知道这是否是唯一的问题,但我必须展示代码,不适合作为评论。
一位用户报告了 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);
不知道这是否是唯一的问题,但我必须展示代码,不适合作为评论。