Java 为什么会出现空指针错误。?
选择菜单项后,我试图显示一个自定义对话框,但是当我设置onClickListener时,如果没有onClickListner,onClickListener工作正常,将显示一个空指针错误。我检查了按钮id的错误,一切都是正确的 你知道为什么吗Java 为什么会出现空指针错误。?,java,android,menu,dialog,Java,Android,Menu,Dialog,选择菜单项后,我试图显示一个自定义对话框,但是当我设置onClickListener时,如果没有onClickListner,onClickListener工作正常,将显示一个空指针错误。我检查了按钮id的错误,一切都是正确的 你知道为什么吗 public void unlinkDeviceClick(MenuItem item){ final Dialog alertDiag = new Dialog(Home.this); alertDiag.setContentVie
public void unlinkDeviceClick(MenuItem item){
final Dialog alertDiag = new Dialog(Home.this);
alertDiag.setContentView(R.layout.unlinkdialog);
alertDiag.setTitle("Unlink Device");
Button yes = (Button)findViewById(R.id.signout);
Button cancel = (Button)findViewById(R.id.cancelsignout);
final EditText usernameField = (EditText)findViewById(R.id.usernameField);
final EditText passwordField = (EditText)findViewById(R.id.passwordField);
final TextView descr = (TextView)findViewById(R.id.unlinkresults);
yes.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
String userName = usernameField.getText().toString();
String password = passwordField.getText().toString();
if(checkLoginFields(userName,password)){
if(checkCredentials(userName,password)){
//loadUnlink();
descr.setText("Sucessfully unlinked");
}
else{
showWrongInfo(new View(Home.this));
}
}
else{
}
}
});
cancel.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
alertDiag.dismiss();
}
});
alertDiag.show();
}
//////////////////////堆栈跟踪//////////////////////////////////////
04-19 10:30:32.198: E/AndroidRuntime(20386): FATAL EXCEPTION: main
04-19 10:30:32.198: E/AndroidRuntime(20386): java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.MenuInflater$InflatedOnMenuItemClickListener.onMenuItemClick(MenuInflater.java:203)
04-19 10:30:32.198: E/AndroidRuntime(20386): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:154)
04-19 10:30:32.198: E/AndroidRuntime(20386): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:964)
04-19 10:30:32.198: E/AndroidRuntime(20386): at com.android.internal.view.menu.MenuBuilder$ActionMenuAdapter$1.onClick(MenuBuilder.java:1565)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.View.performClick(View.java:3135)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.View.onKeyUp(View.java:5055)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.KeyEvent.dispatch(KeyEvent.java:2623)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.View.dispatchKeyEvent(View.java:4603)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1157)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1159)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.widget.ListView.dispatchKeyEvent(ListView.java:2061)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1159)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1159)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1159)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1159)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1159)
04-19 10:30:32.198: E/AndroidRuntime(20386): at com.android.internal.policy.impl.tv.TvWindow$DecorView.superDispatchKeyEvent(TvWindow.java:1161)
04-19 10:30:32.198: E/AndroidRuntime(20386): at com.android.internal.policy.impl.tv.TvWindow.superDispatchKeyEvent(TvWindow.java:803)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.app.Dialog.dispatchKeyEvent(Dialog.java:706)
04-19 10:30:32.198: E/AndroidRuntime(20386): at com.android.internal.policy.impl.tv.TvWindow$DecorView.dispatchKeyEvent(TvWindow.java:1117)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.ViewRoot.deliverKeyEventPostIme(ViewRoot.java:2902)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.ViewRoot.deliverKeyEvent(ViewRoot.java:2860)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.ViewRoot.handleMessage(ViewRoot.java:2059)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.os.Handler.dispatchMessage(Handler.java:99)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.os.Looper.loop(Looper.java:132)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.app.ActivityThread.main(ActivityThread.java:4083)
04-19 10:30:32.198: E/AndroidRuntime(20386): at java.lang.reflect.Method.invokeNative(Native Method)
04-19 10:30:32.198: E/AndroidRuntime(20386): at java.lang.reflect.Method.invoke(Method.java:491)
04-19 10:30:32.198: E/AndroidRuntime(20386): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
04-19 10:30:32.198: E/AndroidRuntime(20386): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
04-19 10:30:32.198: E/AndroidRuntime(20386): at dalvik.system.NativeStart.main(Native Method)
04-19 10:30:32.198: E/AndroidRuntime(20386): Caused by: java.lang.reflect.InvocationTargetException
04-19 10:30:32.198: E/AndroidRuntime(20386): at java.lang.reflect.Method.invokeNative(Native Method)
04-19 10:30:32.198: E/AndroidRuntime(20386): at java.lang.reflect.Method.invoke(Method.java:491)
04-19 10:30:32.198: E/AndroidRuntime(20386): at android.view.MenuInflater$InflatedOnMenuItemClickListener.onMenuItemClick(MenuInflater.java:199)
04-19 10:30:32.198: E/AndroidRuntime(20386): ... 30 more
04-19 10:30:32.198: E/AndroidRuntime(20386): Caused by: java.lang.NullPointerException
04-19 10:30:32.198: E/AndroidRuntime(20386): at com.ameba.api.activityClasses.Home.unlinkDeviceClick(Home.java:604)
04-19 10:30:32.198: E/AndroidRuntime(20386): ... 33 more
没有CallStack,很难说。不过有一个想法,也许findViewById提供的小部件是空的 最好的方法是检查调用堆栈,以确定是“是”按钮还是“取消”按钮出错,或者最好使用断点并逐步查找代码中缺少的内容 如果对话框中有“是”和“取消”按钮,则需要在设置的对话框布局中搜索它们:
Button yes = (Button) alertDialog.findViewById(R.id.signout);
Button cancel = (Button) alertDialog.findViewById(R.id.cancelsignout);
我猜这是因为findViewByIdR.id.signout返回null?我检查了signout按钮的id,它确实是正确的。为什么为空?signout.SetOnClickListener新建OnClickListener{我不确定你的意思,我创建了自己的自定义对话框xml,其中有两个按钮“是”和“取消”。你的意思是:dialog.findviewbydr.id.signout?@Fabii你的按钮只存在于你在对话框R.layout.unlinkdialog中设置的布局中。如果你找到了findViewById,你将在当前活动布局中搜索它们,你将在其中我找不到它们并且有一个NullPointerException。您必须在对话框对象上使用findViewById,在对话框对象上设置包含按钮的布局。我认为@Luksprog猜对了:findViewById方法查找其所有者的小部件层次结构。从活动调用它意味着您希望在活动v的层次结构中有一个小部件查看。但是“是/取消”按钮位于对话框层次结构中,因此正确答案应该是alertDiag.findViewById。。。