AutoCompleteTextview上的NPE很奇怪,并且它不是重复的

时间:2016-08-01 14:43:09

标签: android nullpointerexception autocompletetextview

首先,我知道什么是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,所以如果您有任何想法,欢迎您!

2 个答案:

答案 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 - 您的作者对象为空。