Dwarph
Dwarph

Reputation: 43

Doesn't even get into the method. Error "invoke virtual method java.lang.list on a null object reference"

I'm creating a timetable app, using an SQLite database and it was working fine, until i read an article on good coding practises. I had a DatabaseHelper file with over 1000+ lines of code due to including every create, read, update and delete statement in there. I went away and edited my code so that each table has a separate class for it's CRUD statements, but now it doesn't work. Everytime I run the app, it crashes and i get the error

invoke virtual method java.lang.list Database.SschoolDay_CRUD on a null object reference (90% like that. I'm afraid I wont be able to get the specific error for at least 24 hours, but I can't access a pc with the permissions to run the app until tomorrow afternoon.)

I don't want to roll back to the hell of a 1000 line+ class. So, after some detective work, I've worked out the specific line where it is going wrong.

My DatabaseHelper runs this method

 SschoolDay_CRUD sschool_day;
List<SschoolDay_model_class> s;
public List<SschoolDay_model_class> getAllSSchoolDays() {
            Log.v("Does it get here?", "YES");

            s = sschool_day.getAllSSchoolDays();
            Log.v("Does it get here?", "YES2");

            return s;
        }

I want this then to run the getAllSSchoolDays() method within the SschoolDay_CRUD class, which looks like this:

/*
 * getting all SchoolDays
 */
public List<SschoolDay_model_class> getAllSSchoolDays() {
    Log.v("Peep", "BEFORE");
    List<SschoolDay_model_class> school_day = new ArrayList<SschoolDay_model_class>();
    Log.v("Peep", "after");
    String selectQuery = "SELECT * FROM " + DatabaseHelper.TABLE_SSCHOOL_DAY;

    Log.e(DatabaseHelper.LOG, selectQuery);

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor c = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (c.moveToFirst()) {
        do {
            SschoolDay_model_class sdy = new SschoolDay_model_class();
            sdy.setSchool_day_id(c.getInt((c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY_ID))));
            sdy.setSchool_day(c.getString(c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY)));
            sdy.setUsed(c.getString(c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY_USED)));
            sdy.setNo_of_lessons(c.getInt(c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY_NO_OF_LESSONS)));

            // adding to SchoolDay list
            school_day.add(sdy);
        } while (c.moveToNext());

    }
    return school_day;
}

The log does not even display "BEFORE". Therefore it seems to be the

public List<SschoolDay_model_class> getAllSSchoolDays() {

For extra information, the class SschoolDay_model_class looks like this:

package Database;

public class SschoolDay_model_class {

long school_day_id;
String school_day;
String used;
int no_of_lessons;

//constructors
public SschoolDay_model_class() {
}

public SschoolDay_model_class (long school_day_id, String school_day, String used, int no_of_lessons){
    this.school_day_id = school_day_id;
    this.school_day = school_day;
    this.used = used;
    this.no_of_lessons = no_of_lessons;

}


//setters
public void setSchool_day_id(long school_day_id){
    this.school_day_id = school_day_id;
}

public void setSchool_day(String school_day){
    this.school_day = school_day;
}

public void setUsed(String used) {
    this.used = used;
}

public void setNo_of_lessons(int no_of_lessons){
    this.no_of_lessons = no_of_lessons;
}

//getters
public long getSchool_day_id() {
    return this.school_day_id;
}

public String getschool_day() {
    return this.school_day;
}

public String getUsed() {
    return this.used;
}

public int getNo_of_lessons() {
    return this.no_of_lessons;
}

}

Edit: SschoolDay_CRUD class is this:

       package Database;

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


   import android.content.ContentValues;
   import android.content.Context;
   import android.database.Cursor;
   import android.database.sqlite.SQLiteDatabase;
   import android.database.sqlite.SQLiteOpenHelper;
   import android.util.Log;

   public class SschoolDay_CRUD extends SQLiteOpenHelper {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
}
/*
 * School Days will never be deleted, only set to used or not, which will determine their use.
 * Therefore I have not written a delete statement for school day.
 */

/*
 * Creating a School Day
 */


public long createSSchoolDay(SschoolDay_model_class school_day) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(DatabaseHelper.KEY_SSCHOOL_DAY, school_day.getschool_day());
    values.put(DatabaseHelper.KEY_SSCHOOL_DAY_USED, school_day.getUsed());
    values.put(DatabaseHelper.KEY_SSCHOOL_DAY_NO_OF_LESSONS, school_day.getNo_of_lessons());

    // insert row
    long sschool_day_id = db.insert(DatabaseHelper.TABLE_SSCHOOL_DAY, null, values);

    return sschool_day_id;
    }

/*
 * getting all SchoolDays
 */
public List<SschoolDay_model_class> getAllSSchoolDays() {
    Log.v("Peep", "BEFORE");
    List<SschoolDay_model_class> school_day = new ArrayList<SschoolDay_model_class>();
    Log.v("Peep", "after");
    String selectQuery = "SELECT * FROM " + DatabaseHelper.TABLE_SSCHOOL_DAY;

    Log.e(DatabaseHelper.LOG, selectQuery);

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor c = db.rawQuery(selectQuery, null);

    // looping through all rows and adding to list
    if (c.moveToFirst()) {
        do {
            SschoolDay_model_class sdy = new SschoolDay_model_class();
            sdy.setSchool_day_id(c.getInt((c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY_ID))));
            sdy.setSchool_day(c.getString(c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY)));
            sdy.setUsed(c.getString(c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY_USED)));
            sdy.setNo_of_lessons(c.getInt(c.getColumnIndex(DatabaseHelper.KEY_SSCHOOL_DAY_NO_OF_LESSONS)));

            // adding to SchoolDay list
            school_day.add(sdy);
        } while (c.moveToNext());

    }
    return school_day;
}

/*
 * Updating a SchoolDay
 */
public int updatesSchoolDay(SschoolDay_model_class school_day) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues values = new ContentValues();
    values.put(DatabaseHelper.KEY_SSCHOOL_DAY, school_day.getschool_day());
    values.put(DatabaseHelper.KEY_SSCHOOL_DAY_USED, school_day.getUsed());
    values.put(DatabaseHelper.KEY_SSCHOOL_DAY_NO_OF_LESSONS, school_day.getNo_of_lessons());
    // updating row
    return db.update(DatabaseHelper.TABLE_SSCHOOL_DAY, values, DatabaseHelper.KEY_SSCHOOL_DAY_ID + " = ?",
            new String[] { String.valueOf(school_day.getSchool_day_id()) });
}
@Override
public void onCreate(SQLiteDatabase db) {


    // creating required tables
    db.execSQL(DatabaseHelper.CREATE_TABLE_SSCHOOL_DAY);
    db.execSQL(DatabaseHelper.CREATE_TABLE_SPERIODS);
    db.execSQL(DatabaseHelper.CREATE_TABLE_SLESSON);
    db.execSQL(DatabaseHelper.CREATE_TABLE_SHOMEWORK);
    db.execSQL(DatabaseHelper.CREATE_TABLE_SEXAM);
    db.execSQL(DatabaseHelper.CREATE_TABLE_SLESSON_TIME);
    //creating revision tables
    db.execSQL(DatabaseHelper.CREATE_TABLE_RREVISION_DAY);
    db.execSQL(DatabaseHelper.CREATE_TABLE_RSESSION_PERIOD);
    db.execSQL(DatabaseHelper.CREATE_TABLE_RSESSION);
    db.execSQL(DatabaseHelper.CREATE_TABLE_RSESSION_TIME);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // on upgrade drop older tables
    db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_SSCHOOL_DAY);
    db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_SPERIODS);
    db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_SLESSON);
    db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_SHOMEWORK);
    db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_SEXAM);
    db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_SLESSON_TIME);

    db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_RREVISION_DAY);
    db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_RSESSION_PERIOD);
    db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_RSESSION);
    db.execSQL("DROP TABLE IF EXISTS " +DatabaseHelper.TABLE_RSESSION_TIME);
    // create new tables
    onCreate(db);
        }
public  SschoolDay_CRUD(Context context) {
    super(context, DatabaseHelper.DATABASE_NAME, null, DatabaseHelper.DATABASE_VERSION);
    // TODO Auto-generated constructor stub
}

}

EDIT: new error! (yay) now I'm getting ...considering rolling it back to the 1000+ line, at least that worked !!

03-13 12:32:24.416: E/AndroidRuntime(2374): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference

because of this line :
SQLiteDatabase db = this.getReadableDatabase();

here is the constructor for the DatabaseHelper:

    public Context DBHContext;

 public DatabaseHelper(Context context) {


    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    DBHContext = context;
}

I then use DBHContext in the initialization of the SschoolDay_CRUD

SschoolDay_CRUD sschool_day = new SschoolDay_CRUD(DBHContext);

Upvotes: 1

Views: 1069

Answers (1)

Opiatefuchs
Opiatefuchs

Reputation: 9870

From Your code it seems, that Your sschool_day is not initialized at this time:

     s = sschool_day.getAllSSchoolDays();

You have to initialize SschoolDay_CRUD sschool_day; before calling getAllSSchoolDays();

Your initializing should look like this:

    SschoolDay_CRUD sschool_day = new SschoolDay_CRUD(yourContext);
   List<SschoolDay_model_class> s;
     public List<SschoolDay_model_class> getAllSSchoolDays() {
        Log.v("Does it get here?", "YES");

        s = sschool_day.getAllSSchoolDays();
        Log.v("Does it get here?", "YES2");

        return s;
    }

Upvotes: 1

Related Questions