Search code examples
androidkotlinandroid-room

java.lang.NullPointerException: Attempt to invoke virtual method 'Database.DatabaseClass.EventDao()' on a null object reference


I was creating a simple reminder app with room database based on a youtube tutorial. but it ends with java.lang.NullPointerException: Attempt to invoke virtual method 'com.dev.alarmreminder.Database.EventDao com.dev.alarmreminder.Database.DatabaseClass.EventDao()' on a null object reference.

     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.dev.alarmreminder.Database.EventDao com.dev.alarmreminder.Database.DatabaseClass.EventDao()' on a null object reference
        at com.dev.alarmreminder.MainActivity.setAdapter(MainActivity.java:49)
        at com.dev.alarmreminder.MainActivity.onResume(MainActivity.java:43)

I don't get it why it's called nullpointerexception. tried but it didn't get it.

DatabaseClass.java



@Database(entities = {EntityClass.class}, version = 1)
public abstract class DatabaseClass extends RoomDatabase
{
    public abstract  EventDao EventDao();
    private static DatabaseClass INSTANCE;


    static DatabaseClass getDatabase(final Context context)
    {
        if(INSTANCE == null)
        {
            synchronized (DatabaseClass.class)
            {
                if(INSTANCE == null)
                {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(), DatabaseClass.class, "product_database").build();
                }
            }
        }

        return INSTANCE;
    }

}


EventDao.java

import androidx.room.Dao;
import androidx.room.Insert;
import androidx.room.Query;

import java.util.List;

@Dao
public interface EventDao
{
    @Insert
    void insertAll(EntityClass entityClass);

    @Query("SELECT * FROM myTable")
    List<EntityClass> getAllData();


}


EntityClass.java


import androidx.room.Entity;
import androidx.room.PrimaryKey;

@Entity(tableName = "myTable")
    public class EntityClass
    {
        @PrimaryKey(autoGenerate = true)
        int id;

        String eventname;
        String eventdate;
        String eventtime;


        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getEventname() {
            return eventname;
        }

        public void setEventname(String eventname) {
            this.eventname = eventname;
        }

        public String getEventdate() {
            return eventdate;
        }

        public void setEventdate(String eventdate) {
            this.eventdate = eventdate;
        }

        public String getEventtime() {
            return eventtime;
        }

        public void setEventtime(String eventtime) {
            this.eventtime = eventtime;
        }
    }


MainACtivity

package com.mahidev.alarmreminder;

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

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

import com.mahidev.alarmreminder.Adapter.EventAdapter;
import com.mahidev.alarmreminder.Database.DatabaseClass;
import com.mahidev.alarmreminder.Database.EntityClass;

import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener
{

    Button createEvent;
    EventAdapter eventAdapter;
    RecyclerView recyclerView;
    DatabaseClass databaseClass;


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

        createEvent = findViewById(R.id.btn_createEvent);
        recyclerView = findViewById(R.id.recyclerview);
        createEvent.setOnClickListener(this);



    }

    @Override
    protected void onResume() {
        super.onResume();

        setAdapter();

    }

    private void setAdapter()
    {
        List<EntityClass> classList = databaseClass.EventDao().getAllData();
        eventAdapter = new EventAdapter(getApplicationContext(), classList);
        recyclerView.setAdapter(eventAdapter);
    }


    @Override
    public void onClick(View view)
    {
        if(view == createEvent)
        {
        goToCreateEventActivity();
        }
    }

    private void goToCreateEventActivity()
    {
        Intent intent = new Intent(getApplicationContext(), CreateEvent.class);
        startActivity(intent);
    }
}

issue here is the first line in setAdapter method.


Solution

  • You haven't instantiated databaseClass as such it is null and hence the exception.

    You need to add a line (in the onCreate method, immediately after the setContentView call would be a suitable place)

    databaseClass = Database.getDatabase(this);