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