Java closeDatabase()';关于空对象引用

Java closeDatabase()';关于空对象引用,java,android,sqlite,nullpointerexception,android-sqlite,Java,Android,Sqlite,Nullpointerexception,Android Sqlite,我的密码有问题,上面说 07-22 21:40:43.059 28529-28529/plp.plpedia.developer.larriane.my_plpedia E/AndroidRuntime:致命异常:main 流程:plp.plpedia.developer.larriane.my_plpedia,PID:28529 java.lang.RuntimeException:无法销毁活动{plp.plpedia.developer.larriane.my_plpedia/plp.plp

我的密码有问题,上面说

07-22 21:40:43.059 28529-28529/plp.plpedia.developer.larriane.my_plpedia E/AndroidRuntime:致命异常:main

流程:plp.plpedia.developer.larriane.my_plpedia,PID:28529 java.lang.RuntimeException:无法销毁活动{plp.plpedia.developer.larriane.my_plpedia/plp.plpedia.developer.larriane.my_plpedia.MainNotes}:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'void plp.plpedia.developer.larriane.my_plpedia.NotesCRUDManager.closeDatabase() 位于android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4874) 位于android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4892) 在android.app.ActivityThread.access上$1600(ActivityThread.java:218) 在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1772)上 位于android.os.Handler.dispatchMessage(Handler.java:102) 位于android.os.Looper.loop(Looper.java:145) 位于android.app.ActivityThread.main(ActivityThread.java:6917) 位于java.lang.reflect.Method.invoke(本机方法) 位于java.lang.reflect.Method.invoke(Method.java:372) 在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:1404) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void plp.plpedia.developer.larriane.my_plpedia.NotesCRUDManager.closeDatabase()” 在plp.plpedia.developer.larriane.my_plpedia.MainNotes.onDestroy(MainNotes.java:60)

这是我的NotesCRUDManager.java,数据库

    public class NotesCRUDManager {

        private SQLiteDatabase db;
        private Context context;
        private String DBName = "NotesDB";
        private String TableName = "mynotes";
        private List<Integer> ids_list = new ArrayList<Integer>();
        private List<String> titles_list = new ArrayList<String>();
        private List<String> notes_list = new ArrayList<String>();
        private List<String> remark_list = new ArrayList<String>();

        NotesCRUDManager(Context context) {

            this.context = context;
            // As soon as we call this class our database should be created or opened
            AccessDatabase();
            AccessNotesTable();
        }

        // Opening database
        public void AccessDatabase() {
            // create database named as "Catalog"
            // context.MODE_PRIVATE indicates this database can only be access through this application
            db = context.openOrCreateDatabase(DBName, context.MODE_PRIVATE, null);
        }

        // Selecting our table
        public void AccessNotesTable() {

            db.execSQL("CREATE TABLE IF NOT EXISTS " + TableName + "(_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, note TEXT, remark TEXT)");
        }

        // Inserting product into table
        public void InsertNote(String title, String note, String remark) {

            ContentValues values = new ContentValues(); // create an instance of ContentValues
            values.put("title", title); // parameters are (key, value) but the key = columnName in our Database Table
            values.put("note", note);
            values.put("remark", remark);
            //db.insert() is similar to prepared statement in Java. It will prevent SQL Injections
            db.insert(TableName, null, values);
        }

        public void EditNote(int id, String title, String note, String remark) {

            ContentValues values = new ContentValues(); // create an instance of ContentValues
            values.put("title", title); // parameters are (key, value) but the key = columnName in our Database Table
            values.put("note", note);
            values.put("remark", remark);
            //db.update removes the risk of SQL Injection
            db.update(TableName, values, "_id = ?", new String[]{"" + id});
        }

        public void DeleteNote(int id) {
            // simple sql statement
            db.execSQL("DELETE FROM " + TableName + " WHERE _id = " + id + ";");
        }

        // Showing all rows from table
        public void showNote(List<Integer> ids_list, List<String> titles_list, List<String> notes_list, List<String> remark_list) {

            // this will execute select query
            Cursor cursor = db.rawQuery("SELECT * FROM " + TableName + " ORDER BY _id DESC", null);
            // getting data from all rows
            while (cursor.moveToNext()) {
                //filling up the arraylist with database columns
                ids_list.add(cursor.getInt(0));
                titles_list.add(cursor.getString(1));
                notes_list.add(cursor.getString(2));
                remark_list.add(cursor.getString(3));
            }

        }

        // Relesing database object
        public void closeDatabase() {
            // close the database, always remember only close the database when it is opened
            db.close();
        }
    }
记事本列表似乎是错误

不,读一下stacktrace

at plp.plpedia.developer.larriane.my_plpedia.MainNotes.onDestroy(MainNotes.java:60)
当活动被销毁而您没有单击“创建”按钮时会发生什么情况

您的数据库引用为空

移动

重新创建


另外,使用SqliteOpenHelper类也可能是有益的。如果用户未单击,则会导致nmanager对象未初始化,从而导致崩溃

更改此项:

@Override
protected void onDestroy() {
    nmanager.closeDatabase();
    super.onDestroy();
}
为此:

@Override
protected void onDestroy() {
    if(nmanager != null){
        nmanager.closeDatabase();
    }
    super.onDestroy();
}
@Override
protected void onDestroy() {
    nmanager.closeDatabase();
    super.onDestroy();
}
@Override
protected void onDestroy() {
    if(nmanager != null){
        nmanager.closeDatabase();
    }
    super.onDestroy();
}