0

So I have tried looking up on Youtube by searching :

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

The stack trace is here

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)

And I have tried using multiple solutions like this Attempt to invoke interface method 'int android.database.Cursor.getCount()' on a null object reference but still no luck. Tried changing if (cursor.getCount() == 0) to if (cursor == 0) but still having error.

This is my 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));
            }
        }
    }


}

This is my custom adapter

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);

        }
    }
}

This is my Mortgage Database helper

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);

        }
    }
}

This is my 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();

                }
            }
        });
    }

}
JunChee26
  • 1
  • 2
  • This code should be simplified; saying `M1=...M4=...` repeatedly is adding unnecessary lines. – Alias Cartellano Nov 16 '21 at 18:34
  • Please [add the stacktrace](https://stackoverflow.com/questions/3988788/what-is-a-stack-trace-and-how-can-i-use-it-to-debug-my-application-errors) to your question to help answerers. You made a mistake and added your custom adapter twice instead of your MDH . – Alias Cartellano Nov 16 '21 at 18:47
  • OK added a stack trace already, I am new here so I thought the error was enough @AliasCartellano – JunChee26 Nov 17 '21 at 03:44
  • Could you also fix the issue with your MortgageDatabaseHelper code? You used the custom adapter code twice instead. – Alias Cartellano Nov 17 '21 at 05:15
  • Thanks @AliasCartellano solved it already :) – JunChee26 Nov 17 '21 at 06:39

1 Answers1

0

So after repeating the tutorial countless times and reviewing frame by frame I found my problem

The solution is here

 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;
    }

It was DB.rawQuery(query,null) by adding cursor in front of it solved it cursor = DB.rawQuery(query,null);

and also the getCount() error was solved by changing if (cursor.getCount() == 0) to 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));
            }
        }
    }
JunChee26
  • 1
  • 2