首页 > 解决方案 > java.lang.NullPointerException:尝试在空对象引用上调用接口方法“int android.database.Cursor.getCount()”

问题描述

所以我尝试通过搜索在 Youtube 上查找:

"Attempt to invoke interface method 'int android.database.Cursor.getCount()' on a null object reference"

堆栈跟踪在这里

2021-11-17 11:41:33.025 20471-20471/com.example.budgetcalculator E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.budgetcalculator, PID: 20471
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.budgetcalculator/com.example.budgetcalculator.Summary}: java.lang.NullPointerException: Attempt to invoke interface method 'int android.database.Cursor.getColumnCount()' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int android.database.Cursor.getColumnCount()' on a null object reference
        at com.example.budgetcalculator.Summary.loadDataFromDB(Summary.java:69)
        at com.example.budgetcalculator.Summary.onCreate(Summary.java:61)
        at android.app.Activity.performCreate(Activity.java:6975)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6541) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

而且我尝试过使用多种解决方案,例如尝试在空对象引用上调用接口方法“int android.database.Cursor.getCount()”, 但仍然没有运气。尝试更改 if (cursor.getCount() == 0)if (cursor == 0)但仍然有错误。

这是我的 Summary.java

package com.example.budgetcalculator;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.database.Cursor;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class Summary extends AppCompatActivity {
    //Declaring databases
    MortDatabaseHelper MortDB;
    CCDatabaseHelper CCDB;
    HPDatabaseHelper HPDB;
    PLDataBaseHelper PLDB;
    PTPTNDBHelper PTPTNDB;
    TLDatabaseHelper TLDB;

    //Declaring CustomAdapter
    CustomAdapter customAdapter;

    //Declaring lists following YouTube
    ArrayList<String> MortID, Mort1, Mort2, Mort3, Mort4, Mort5, Mort6, MortSum;
    RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_summary);

        //Declaring all the database helper
        MortDB = new MortDatabaseHelper(Summary.this);
        CCDB = new CCDatabaseHelper(Summary.this);
        HPDB = new HPDatabaseHelper(Summary.this);
        PLDB = new PLDataBaseHelper(Summary.this);
        PTPTNDB = new PTPTNDBHelper(Summary.this);
        TLDB = new TLDatabaseHelper(Summary.this);

        recyclerView = findViewById(R.id.RV_Mort);

        MortID = new ArrayList<>();
        Mort1 = new ArrayList<>();
        Mort2 = new ArrayList<>();
        Mort3 = new ArrayList<>();
        Mort4 = new ArrayList<>();
        Mort5 = new ArrayList<>();
        Mort6 = new ArrayList<>();
        MortSum = new ArrayList<>();

        customAdapter = new CustomAdapter(Summary.this,MortID,Mort1,Mort2,Mort3,
                Mort4,Mort5,Mort6,MortSum);
        recyclerView.setAdapter(customAdapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(Summary.this));

        loadDataFromDB();

    }

     void loadDataFromDB() {
        MortDB = new MortDatabaseHelper(this);
        Cursor cursor = MortDB.readMortgageData();

        if (cursor.getCount() == 0){
            Toast.makeText(this,"No data",Toast.LENGTH_SHORT).show();
        }
        else{
            while (cursor.moveToNext()){
                MortID.add(cursor.getString(0));
                Mort1.add(cursor.getString(1));
                Mort2.add(cursor.getString(2));
                Mort3.add(cursor.getString(3));
                Mort4.add(cursor.getString(4));
                Mort5.add(cursor.getString(5));
                Mort6.add(cursor.getString(6));
                MortSum.add(cursor.getString(7));
            }
        }
    }


}

这是我的自定义适配器

package com.example.budgetcalculator;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.ConcurrentModificationException;

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {

    private Context context;
    private ArrayList MortID, Mort1, Mort2, Mort3, Mort4, Mort5, Mort6, Mortsum;
    CustomAdapter(Context context,
                  ArrayList mortID,
                  ArrayList mort1,
                  ArrayList mort2,
                  ArrayList mort3,
                  ArrayList mort4,
                  ArrayList mort5,
                  ArrayList mort6,
                  ArrayList mortsum){

        this.context = context;
        this.Mortsum = mortID;
        this.Mort1 = mort1;
        this.Mort2 = mort2;
        this.Mort3 = mort3;
        this.Mort4 = mort4;
        this.Mort5 = mort5;
        this.Mort6 = mort6;
        this.Mortsum = mortsum;
    }
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.my_row,parent,false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.mort_id_text.setText(String.valueOf(MortID.get(position)));
        holder.mort_1_text.setText(String.valueOf(Mort1.get(position)));
        holder.mort_2_text.setText(String.valueOf(Mort2.get(position)));
        holder.mort_3_text.setText(String.valueOf(Mort3.get(position)));
        holder.mort_4_text.setText(String.valueOf(Mort4.get(position)));
        holder.mort_5_text.setText(String.valueOf(Mort5.get(position)));
        holder.mort_6_text.setText(String.valueOf(Mort6.get(position)));
        holder.mort_sum_text.setText(String.valueOf(Mortsum.get(position)));
    }

    @Override
    public int getItemCount() {
        return MortID.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder{
        TextView mort_id_text, mort_1_text, mort_2_text, mort_3_text, mort_4_text, mort_5_text, mort_6_text, mort_sum_text;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            mort_id_text = itemView.findViewById(R.id.mort_id_text);
            mort_1_text = itemView.findViewById(R.id.mort_1_text);
            mort_2_text = itemView.findViewById(R.id.mort_2_text);
            mort_3_text = itemView.findViewById(R.id.mort_3_text);
            mort_4_text = itemView.findViewById(R.id.mort_4_text);
            mort_5_text = itemView.findViewById(R.id.mort_5_text);
            mort_6_text = itemView.findViewById(R.id.mort_6_text);
            mort_sum_text = itemView.findViewById(R.id.mort_sum_text);

        }
    }
}

这是我的抵押数据库助手

package com.example.budgetcalculator;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.ConcurrentModificationException;

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> {

    private Context context;
    private ArrayList MortID, Mort1, Mort2, Mort3, Mort4, Mort5, Mort6, Mortsum;
    CustomAdapter(Context context,
                  ArrayList mortID,
                  ArrayList mort1,
                  ArrayList mort2,
                  ArrayList mort3,
                  ArrayList mort4,
                  ArrayList mort5,
                  ArrayList mort6,
                  ArrayList mortsum){

        this.context = context;
        this.Mortsum = mortID;
        this.Mort1 = mort1;
        this.Mort2 = mort2;
        this.Mort3 = mort3;
        this.Mort4 = mort4;
        this.Mort5 = mort5;
        this.Mort6 = mort6;
        this.Mortsum = mortsum;
    }
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.my_row,parent,false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.mort_id_text.setText(String.valueOf(MortID.get(position)));
        holder.mort_1_text.setText(String.valueOf(Mort1.get(position)));
        holder.mort_2_text.setText(String.valueOf(Mort2.get(position)));
        holder.mort_3_text.setText(String.valueOf(Mort3.get(position)));
        holder.mort_4_text.setText(String.valueOf(Mort4.get(position)));
        holder.mort_5_text.setText(String.valueOf(Mort5.get(position)));
        holder.mort_6_text.setText(String.valueOf(Mort6.get(position)));
        holder.mort_sum_text.setText(String.valueOf(Mortsum.get(position)));
    }

    @Override
    public int getItemCount() {
        return MortID.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder{
        TextView mort_id_text, mort_1_text, mort_2_text, mort_3_text, mort_4_text, mort_5_text, mort_6_text, mort_sum_text;
        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            mort_id_text = itemView.findViewById(R.id.mort_id_text);
            mort_1_text = itemView.findViewById(R.id.mort_1_text);
            mort_2_text = itemView.findViewById(R.id.mort_2_text);
            mort_3_text = itemView.findViewById(R.id.mort_3_text);
            mort_4_text = itemView.findViewById(R.id.mort_4_text);
            mort_5_text = itemView.findViewById(R.id.mort_5_text);
            mort_6_text = itemView.findViewById(R.id.mort_6_text);
            mort_sum_text = itemView.findViewById(R.id.mort_sum_text);

        }
    }
}

这是我的 MortgageActivity.java

package com.example.budgetcalculator;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class ExpenseActivity extends AppCompatActivity {

    Button insert;
    EditText Mort1,Mort2,Mort3,Mort4,Mort5,Mort6;
    public static int sum;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_expense);

        Mort1 = findViewById(R.id.Mort1);
        Mort2 = findViewById(R.id.Mort2);
        Mort3 = findViewById(R.id.Mort3);
        Mort4 = findViewById(R.id.Mort4);
        Mort5 = findViewById(R.id.Mort5);
        Mort6 = findViewById(R.id.Mort6);

        insert = findViewById(R.id.Insert_Btn);
        insert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                try {

                    int M1 = Integer.valueOf(Mort1.getText().toString());
                    int M2 = Integer.valueOf(Mort2.getText().toString());
                    int M3 = Integer.valueOf(Mort3.getText().toString());
                    int M4 = Integer.valueOf(Mort4.getText().toString());
                    int M5 = Integer.valueOf(Mort5.getText().toString());
                    int M6 = Integer.valueOf(Mort6.getText().toString());

                    sum = M1 + M2 + M3 + M4 + M5 + M6;

                    MortDatabaseHelper mortDatabaseHelper = new MortDatabaseHelper(ExpenseActivity.this);
                    mortDatabaseHelper.addMortgageInfo(Integer.valueOf(Mort1.getText().toString()),
                            Integer.valueOf(Mort2.getText().toString()),
                            Integer.valueOf(Mort3.getText().toString()),
                            Integer.valueOf(Mort4.getText().toString()),
                            Integer.valueOf(Mort5.getText().toString()),
                            Integer.valueOf(Mort6.getText().toString()),
                            Integer.valueOf(sum));

                    Intent intent = new Intent(ExpenseActivity.this, HirePurchase.class);
                    startActivity(intent);
                }
                catch (Exception e){
                   Toast.makeText(ExpenseActivity.this,"Enter 0 if no mortgages", Toast.LENGTH_SHORT).show();

                }
            }
        });
    }

}

标签: javasqliteandroid-studio

解决方案


所以在无数次重复教程并逐帧审查后,我发现了我的问题

解决方案在这里

 Cursor readMortgageData(){
        String query = " SELECT * FROM " + TABLE_NAME;
        SQLiteDatabase DB = this.getReadableDatabase();

        Cursor cursor = null;
        if (DB != null){
            cursor = DB.rawQuery(query,null);
        }
        return cursor;
    }

这是 DB.rawQuery(query,null)通过在它前面添加光标解决了它 cursor = DB.rawQuery(query,null);

并且 getCount() 错误也通过更改 if (cursor.getCount() == 0)为解决了if (cursor == null)

void loadDataFromDB() {
        MortDB = new MortDatabaseHelper(this);
        Cursor cursor = MortDB.readMortgageData();

        if (cursor == null){
            Toast.makeText(this,"No data",Toast.LENGTH_SHORT).show();
        }
        else{
            while (cursor.moveToNext()){
                MortID.add(cursor.getString(0));
                Mort1.add(cursor.getString(1));
                Mort2.add(cursor.getString(2));
                Mort3.add(cursor.getString(3));
                Mort4.add(cursor.getString(4));
                Mort5.add(cursor.getString(5));
                Mort6.add(cursor.getString(6));
                MortSum.add(cursor.getString(7));
            }
        }
    }

推荐阅读