首先,我知道什么是NULL指针异常。不,这个帖子不是重复的 所以请不要告诉我我的对象是空的,我知道。我无法理解为什么,我认为它可能与处理程序线程有关。我是一位经过确认的Android开发者,所以请您仔细阅读问题并停止侮辱您所有的"您知道什么是NPE吗?"。谢谢。
我正在制作一款Android应用,一些用户正在尝试一次我无法重现或理解的崩溃,无论我怎么努力。
为简单起见,我有2 AutoCompleteTextView
对应于作者的名字和姓氏。当您开始输入时,EditTexts会自动完成数据库中的现有作者。
这对我和95%的用户来说都很好,但有些人正在尝试崩溃,有时候,在点击某个项目时。
以下是代码:
final List<Author> authors = Author.listAll(Author.class);
List<String> authorNames = getAuthorNames(authors, false);
authorLastnameEdittext.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_dropdown_item_1line, authorNames));
authorFirstnameEdittext.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_dropdown_item_1line, authorNames));
AdapterView.OnItemClickListener onExistingAuthorClick = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String text = ((TextView) view).getText().toString();
for (Author a : authors) {
if (!a.toString().equals(text)) {
continue;
}
author = a;
authorLastnameEdittext.setText(author.getLastname());
authorFirstnameEdittext.setText(author.getFirstname());
existingAuthor = true;
}
}
};
我在Firebase中拥有的NPE的Stacktrace是:
Exception java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.String com.vgm.mylibrary.model.Author.getFirstname()' on a null object reference
com.vgm.mylibrary.dialog.AddBookDialog$7.onItemClick (AddBookDialog.java:292)
android.widget.AutoCompleteTextView.performCompletion (AutoCompleteTextView.java:915)
android.widget.AutoCompleteTextView.access$500 (AutoCompleteTextView.java:91)
android.widget.AutoCompleteTextView$DropDownItemClickListener.onItemClick (AutoCompleteTextView.java:1208)
android.widget.AdapterView.performItemClick (AdapterView.java:334)
android.widget.AbsListView.performItemClick (AbsListView.java:1531)
android.widget.AbsListView$PerformClick.run (AbsListView.java:3667)
android.widget.AbsListView$3.run (AbsListView.java:5590)
android.os.Handler.handleCallback (Handler.java:739)
android.os.Handler.dispatchMessage (Handler.java:95)
android.os.Looper.loop (Looper.java:145)
android.app.ActivityThread.main (ActivityThread.java:5951)
java.lang.reflect.Method.invoke (Method.java)
java.lang.reflect.Method.invoke (Method.java:372)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1388)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1183)
所以NPE发生在这条线上:
authorFirstnameEdittext.setText(author.getFirstname());
我的问题很简单:这怎么可能?! NPE说,在这一行,作者是空的。承认这是真的,应用程序应该在执行之前崩溃该行: authorLastnameEdittext.setText(author.getLastname());
以下是帮助可视化的视图的屏幕截图: Autocomplete screenshot
谢谢!
修改: 我做了pskink建议的修改,用Author ArrayAdapter替换了我的String ArrayAdapter。所以现在的代码是:
final List<Author> authors = Author.listAll(Author.class);
authorLastnameEdittext.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_dropdown_item_1line, authors));
authorFirstnameEdittext.setAdapter(new ArrayAdapter<>(getActivity(), android.R.layout.simple_dropdown_item_1line, authors));
AdapterView.OnItemClickListener onExistingAuthorClick = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
author = (Author) parent.getAdapter().getItem(position);
if (author == null) {
return;
}
authorLastnameEdittext.setText(author.getLastname());
authorFirstnameEdittext.setText(author.getFirstname());
existingAuthor = true;
}
};
请注意,这并不能解释之前的NPE,所以如果您有任何想法,欢迎您!
答案 0 :(得分:3)
由于author.getLastname()
在崩溃之前执行,author
似乎是!= null
,而在下一行它变为空。
author
显然是一个实例变量,由author = a;
设置。
看起来另一个线程正在修改此变量。没有更多信息,我建议如下:
a.getLastname()
和a.getFirstname()
。 a
是一个局部变量。它不能从外部修改(对象的内容可以更改,而不是对它的引用),因此可以保证,如果a.getLastname()
没有抛出NPE,则后续的a.getFirstname()
将不会任
答案 1 :(得分:-1)
Author.getFirstname()' on a null object reference
- 您的作者对象为空。