Реализация панели поиска и получение 'java .lang.Object [] java .util.Collection.toArray ()' при ошибке ссылки на нулевой объект - PullRequest
0 голосов
/ 08 апреля 2020

Я новичок в android studio, и я пытался внедрить панель поиска в мое приложение, и я столкнулся с ошибкой здания. Это нормально, но когда я пытаюсь открыть приложение на своем телефоне, отображается сообщение «приложение остановлено».

Logcat (Ошибки):

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.sliteproj, PID: 1445
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sliteproj/com.example.sliteproj.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6944)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
 Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference
    at java.util.ArrayList.<init>(ArrayList.java:191)
    at com.example.sliteproj.Adapter.<init>(Adapter.java:34)
    at com.example.sliteproj.MainActivity.showRecord(MainActivity.java:57)
    at com.example.sliteproj.MainActivity.onCreate(MainActivity.java:41)
    at android.app.Activity.performCreate(Activity.java:7183)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032) 
    at android.app.ActivityThread.-wrap11(Unknown Source:0) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) 
    at android.os.Handler.dispatchMessage(Handler.java:105) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6944) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 

Я понимаю, что это часто задаваемый вопрос, и я просмотрел другие ответы и решения. Я попытался инициализировать список, но все еще не могу исправить ошибку. Мне кажется, у меня возникают проблемы с пониманием, где именно необходима инициализация.

Мой код (Adapter. java):

public class Adapter extends RecyclerView.Adapter<Adapter.Holder> implements 
Filterable {
private Context context;
private ArrayList<Model> arrayList;
private ArrayList<Model> exampleArrayList;

DatabaseHelper databaseHelper;

public Adapter(Context context, ArrayList<Model> arrayList) {
    this.context = context;
    this.arrayList = arrayList;
    exampleArrayList = new ArrayList<>(exampleArrayList);

    databaseHelper = new DatabaseHelper(context);
}

@Override
public Filter getFilter() {
    return exampleFilter;
}

private Filter exampleFilter = new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        List<Model> filteredList = new ArrayList<>();

        if (constraint == null || constraint.length() == 0) {
            filteredList.addAll(exampleArrayList);
        } else {
            String filterPattern = constraint.toString().toLowerCase().trim();

            for (Model item: exampleArrayList) {
                if (item.getName().toLowerCase().contains(filterPattern)) {
                    filteredList.add(item);
                }
            }
        }

        FilterResults results = new FilterResults();
        results.values = filteredList;

        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        arrayList.clear();
        arrayList.addAll((List) results.values);
        notifyDataSetChanged();
    }
};
}

1 Ответ

1 голос
/ 08 апреля 2020

Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference

Первая строка объявляет переменную с именем exampleArrayList, но на самом деле она еще не содержит примитивного значения. Вместо этого он содержит указатель (потому что типом является ArrayList<Model>, который является ссылочным типом). Поскольку вы еще не сказали, на что указывать, Java устанавливает его на ноль, что означает «Я ни на что не указываю».

public Adapter(Context context, ArrayList<Model> arrayList) {
    this.context = context;
    this.arrayList = arrayList;
    //this line you are assing array list from null object thats why you are getting **NullPointerException**
    exampleArrayList = new ArrayList<>(exampleArrayList);

    databaseHelper = new DatabaseHelper(context);
}

Solution

замените exampleArrayList = new ArrayList<>(exampleArrayList); на exampleArrayList = new ArrayList<>() или если вы хотите присвоить массив, который приходит из конструктора, тогда exampleArrayList = new ArrayList<>(arrayList); или exampleArrayList = arrayList

Edit 2

private void showRecord() {

    adapter = new Adapter(MainActivity.this,
            databaseHelper.getAllData(Constants.C_TAG + " DESC"));

    mRecyclerView.setAdapter(adapter);
}

Второе исключение bcz из вас объявлено объектом адаптера глобально, но вы локально создаете объект адаптера в методе showRecord, поэтому глобальный объект адаптера равен нулю, и вы получаете доступ к глобальному объекту, и вы получаете исключение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...