实现搜索栏和获取';java.lang.Object[]java.util.Collection.toArray()';关于空对象引用错误
我是android studio的新手,我一直在尝试在我的应用程序上实现一个搜索栏,但我遇到了一个构建错误。安装没问题,但当我尝试在手机上打开应用程序时,会显示“应用程序已停止” Logcat(错误):实现搜索栏和获取';java.lang.Object[]java.util.Collection.toArray()';关于空对象引用错误,java,android,android-studio,Java,Android,Android Studio,我是android studio的新手,我一直在尝试在我的应用程序上实现一个搜索栏,但我遇到了一个构建错误。安装没问题,但当我尝试在手机上打开应用程序时,会显示“应用程序已停止” Logcat(错误): E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.sliteproj, PID: 1445 java.lang.RuntimeException: Unable to start activity ComponentInfo
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)
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();
}
};
}
E/AndroidRuntime:致命异常:主
流程:com.example.sliteproj,PID:1445
java.lang.RuntimeException:无法启动activity ComponentInfo{com.example.sliteproj/com.example.sliteproj.MainActivity}:java.lang.NullPointerException:尝试对空对象引用调用接口方法“java.lang.Object[]java.util.Collection.toArray()”
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
位于android.app.ActivityThread.-wrap11(未知来源:0)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
位于android.os.Handler.dispatchMessage(Handler.java:105)
位于android.os.Looper.loop(Looper.java:164)
位于android.app.ActivityThread.main(ActivityThread.java:6944)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.Zygote$MethodAndArgsCaller.run上(Zygote.java:327)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
原因:java.lang.NullPointerException:尝试对空对象引用调用接口方法“java.lang.Object[]java.util.Collection.toArray()”
位于java.util.ArrayList。(ArrayList.java:191)
位于com.example.sliteproj.Adapter。(Adapter.java:34)
位于com.example.sliteproj.MainActivity.showRecord(MainActivity.java:57)
位于com.example.sliteproj.MainActivity.onCreate(MainActivity.java:41)
位于android.app.Activity.performCreate(Activity.java:7183)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
位于android.app.ActivityThread.-wrap11(未知来源:0)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
位于android.os.Handler.dispatchMessage(Handler.java:105)
位于android.os.Looper.loop(Looper.java:164)
位于android.app.ActivityThread.main(ActivityThread.java:6944)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.Zygote$MethodAndArgsCaller.run上(Zygote.java:327)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
我知道这是一个常见的问题,我已经看过了其他的答案和解决方案。我已尝试初始化列表,但仍然无法修复错误。我想我在理解确切需要初始化的位置时遇到了问题
我的代码(Adapter.java):
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)
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();
}
};
}
公共类适配器扩展了RecyclerView。适配器实现
可过滤{
私人语境;
私有ArrayList ArrayList;
私有ArrayList示例ArrayList;
数据库助手数据库助手;
公共适配器(上下文上下文,ArrayList ArrayList){
this.context=上下文;
this.arrayList=arrayList;
exampleArrayList=新建ArrayList(exampleArrayList);
databaseHelper=新的databaseHelper(上下文);
}
@凌驾
公共过滤器getFilter(){
返回示例过滤器;
}
私有筛选器exampleFilter=新筛选器(){
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
List filteredList=新建ArrayList();
if(constraint==null | | constraint.length()==0){
filteredList.addAll(例如ArrayList);
}否则{
String filterPattern=constraint.toString().toLowerCase().trim();
对于(模型项:exampleArrayList){
if(item.getName().toLowerCase().contains(filterPattern)){
filteredList.add(项目);
}
}
}
FilterResults results=新的FilterResults();
results.values=filteredList;
返回结果;
}
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
arrayList.clear();
addAll((列表)results.values);
notifyDataSetChanged();
}
};
}
原因:java.lang.NullPointerException:尝试在空对象引用上调用接口方法“java.lang.Object[]java.util.Collection.toArray()”
private void showRecord() {
adapter = new Adapter(MainActivity.this,
databaseHelper.getAllData(Constants.C_TAG + " DESC"));
mRecyclerView.setAdapter(adapter);
}
第一行声明了一个名为exampleArrayList
的变量,但它实际上还没有包含原语值。相反,它包含一个指针(因为类型是引用类型ArrayList
)。由于您还没有说要指向什么,Java将其设置为null,这意味着“我没有指向任何东西”
第二个异常bcz是全局声明的适配器对象,但您正在本地以showRecord方法创建适配器对象,这就是为什么globall适配器对象为null,并且您正在访问全局对象,并且您得到异常exampleArrayList=new ArrayList(exampleArrayList);此语句中出现错误,您正在从null创建arraylist。替换为exampleArrayList=newArrayList()<代码>exampleArrayList=新建ArrayList(exampleArrayList)代码>–这就是问题所在。您的参数名为
arrayList
,因此,如果您确实需要该arrayList
的单独副本,那么它应该是exampleAraylist=newArraylist(arrayList)代码>。否则,您只需执行exampleArrayList=arrayList代码>。这已经修复了它以及如何打开,但当我按下搜索栏时,它会关闭应用程序。现在,我有一个错误,上面写着“java.lang.NullPointerException:尝试调用上的虚拟方法'android.widget.Filter com.example.sliteproj.Adapter.getFilter()