简体   繁体   English

在 null object 参考错误上实现搜索栏并获取“java.lang.Object[] java.util.Collection.toArray()”

[英]Implementing search bar and getting 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference error

I am new to android studio and I have been trying to implement a search bar onto my app and I've come across a building error.我是 android 工作室的新手,我一直在尝试在我的应用程序上实现搜索栏,但遇到了构建错误。 It install's fine but when I try to open the app on my phone shows "application has stopped".它安装得很好,但是当我尝试在手机上打开应用程序时显示“应用程序已停止”。

Logcat (Errors): 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) 

I understand that this is a frequently asked question, and have looked through the other answers and solutions.我知道这是一个常见问题,并查看了其他答案和解决方案。 I have tried initializing the List but still, am unable to fix the error.I think I am having trouble understanding where the initialization is exactly needed.我已尝试初始化列表,但仍然无法修复错误。我想我无法理解确切需要初始化的位置。

My code (Adapter.java):我的代码(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();
    }
};
}

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

The first line declares a variable named exampleArrayList , but it does not actually contain a primitive value yet.第一行声明了一个名为exampleArrayList的变量,但它实际上还没有包含原始值。 Instead, it contains a pointer (because the type is ArrayList<Model> which is a reference type).相反,它包含一个指针(因为类型是ArrayList<Model>这是一个引用类型)。 Since you have not yet said what to point to, Java sets it to null, which means "I am pointing to nothing".由于您还没有说要指向什么,因此 Java 将其设置为 null,这意味着“我没有指向任何东西”。

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

replace exampleArrayList = new ArrayList<>(exampleArrayList);替换exampleArrayList = new ArrayList<>(exampleArrayList); with exampleArrayList = new ArrayList<>() or if you want to assign array which is comming from constructor then exampleArrayList = new ArrayList<>(arrayList);使用exampleArrayList = new ArrayList<>()或者如果你想分配来自构造函数的数组,那么exampleArrayList = new ArrayList<>(arrayList); or exampleArrayList = arrayListexampleArrayList = arrayList

Edit 2

private void showRecord() {

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

    mRecyclerView.setAdapter(adapter);
}

Second exception bcz of you are declared adapter object globally but you are creating adapter object in showRecord method locally thats why globall adapter object is null and you are accessing global object and you are getting exception Second exception bcz of you are declared adapter object globally but you are creating adapter object in showRecord method locally thats why globall adapter object is null and you are accessing global object and you are getting exception

I faced the same problem because some fields were null in my real-time database.我遇到了同样的问题,因为我的实时数据库中的某些字段是 null。 As soon as I cleared the fields with null values , the error got solved.一旦我清除了具有 null 值的字段,错误就解决了。 Sometimes errors may not be in the code.有时错误可能不在代码中。 It can be related to your data.它可能与您的数据有关。

PS - This is one of the solutions. PS - 这是解决方案之一。 (For my case) (对于我的情况)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 搜索适配器 - 空对象引用上的“java.lang.Object[] java.util.Collection.toArray()” - Search adapter - 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference 尝试在空对象引用上调用接口方法&#39;java.lang.Object [] java.util.Collection.toArray()&#39; - Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference 尝试调用接口方法“ java.lang.Object [] java.util.Collection.toArray()” - Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' 尝试在空对象引用上调用虚拟方法&#39;boolean java.util.ArrayList.add(java.lang.Object)&#39; - Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference 尝试在空对象引用上调用接口方法“java.lang.Object java.util.Map$Entry.getValue()” - Attempt to invoke interface method 'java.lang.Object java.util.Map$Entry.getValue()' on a null object reference Android NullPointer 尝试在空对象引用上调用虚拟方法“boolean java.util.ArrayList.add(java.lang.Object)” - Android NullPointer Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“boolean java.util.ArrayList.add(java.lang.Object)” - java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference java.util.arraylist 不能转换为 java.lang.object[] - java.util.arraylist cannot be cast to java.lang.object[] 处理多个parcelable arraylists并获取&#39;boolean java.util.ArrayList.add(java.lang.Object)&#39; - Handling multiple parcelable arraylists and getting 'boolean java.util.ArrayList.add(java.lang.Object)' 必需的java.util.ArrayList <String> ,找到java.lang.Object:我不明白此错误的原因 - required java.util.ArrayList<String>,found java.lang.Object : I do not understand the reason for this error
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM