getReadableDatabase 上的 android 空指针异常

标签 android database sqlite nullpointerexception

我正在尝试从 Assets 中复制数据库,但在我的 createDatabase() 方法中我遇到了空指针异常。这发生在调用 getReadableDatabase 时。

public static synchronized MetroLinkDatabaseHelper getInstance(Context context) {

//        Using a singleton to minmize the chance of opening multiple
//        decreasing any chance of memory leak
        if(myInstance == null) {
            myInstance = new MetroLinkDatabaseHelper(context);
        }
        return myInstance;
    }
  private MetroLinkDatabaseHelper(Context context) {
        super(context, DB_NAME, null, 1);
        this.mycontext = context;
        boolean dbexist = checkdatabase();
        if (dbexist) {
        } else {
            System.out.println("Database doesn't exist");
            try {
                createdatabase();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    //      Create (copy the original in assets) if not exist using copydatabase
    public void createdatabase() throws IOException {
        boolean dbexist = checkdatabase();
        if (dbexist) {
        } else {
//            SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
             this.getReadableDatabase();
                 try {

                copydatabase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }

错误日志如下:

08-29 14:13:05.147    2222-2222/com.bkane56.practice.practiceapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.bkane56.practice.practiceapp, PID: 2222
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.bkane56.practice.practiceapp/com.bkane56.practice.practiceapp.ListStopsActivity}: 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
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2250)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
            at android.app.ActivityThread.access$800(ActivityThread.java:155)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
     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
            at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:268)
            at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
            at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
            at com.bkane56.practice.practiceapp.MetroLinkDatabaseHelper.createdatabase(MetroLinkDatabaseHelper.java:66)
            at com.bkane56.practice.practiceapp.MetroLinkDatabaseHelper.<init>(MetroLinkDatabaseHelper.java:52)
            at com.bkane56.practice.practiceapp.MetroLinkDatabaseHelper.getInstance(MetroLinkDatabaseHelper.java:38)
            at com.bkane56.practice.practiceapp.ListStopsActivity.<init>(ListStopsActivity.java:28)
            at java.lang.reflect.Constructor.newInstance(Native Method)
            at java.lang.Class.newInstance(Class.java:1606)
            at android.app.Instrumentation.newActivity(Instrumentation.java:1089)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2240)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
            at android.app.ActivityThread.access$800(ActivityThread.java:155)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1317)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

第 66 行 =

this.getReadableDatabase();

有什么想法吗?我之前确实以更长的形式问过这个问题,但没有得到任何帮助。

谢谢

最佳答案

你的问题在这里:

com.bkane56.practice.practiceapp.ListStopsActivity.<init>(ListStopsActivity.java:28)

您正试图在 super.onCreate() 调用 onCreate() 方法之前对 Activity 实例执行某些操作 Activity 。通常,这不起作用,像这样的异常(exception)情况。

不是从初始化程序中调用 MetroLinkDatabaseHelper 上的 getInstance(),而是将该调用移至 super.onCreate() 之后 onCreate() 方法。

关于getReadableDatabase 上的 android 空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32289911/

相关文章:

java - 如何在android中实现客户端服务器来制作BINGO游戏,但不用于聊天应用程序

java - 当有多个结果时使用 hibernate Criteria.uniqueResult()

ruby-on-rails - rails : Make request to development environment while using tests

java - 如何修复空光标 - android studio

java - 用于 SQLite v2.X 的 sqlite-jdbc

python - 无法使用输入作为名称在 Python 中创建 SQL 表

android - SiP域演示(安卓)

Android Studio 未启动 : Fatal error initializing 'com. intellij.util.indexing.FileBasedIndex

java - 安卓工作室 : "attempting to assign weaker access privileges" error on Room Database implementation

database - 每个页面 View 的成本更高 - 数据库写入还是文件写入?