安卓 - openOrCreateDatabase - 空指针异常

4

我有一个类DAO,在调用我的类conexao时,该方法返回null,但为什么呢?

public void criarBanco() {
        Conexao conexao = new Conexao();
        try {
            BANCO_DE_DADOS = conexao.abrirBanco(); // <<<<<<<<<<<<<
            String SQL = "CREATE TABLE IF NOT EXISTS tablecadastropessoa ( _id INTEGER PRIMARY KEY, nome TEXT, telefone TEXT)";
            BANCO_DE_DADOS.execSQL(SQL);
        } catch (Exception e) {
            Log.i(TAG, "Erro ao criar o banco" + e);
        } finally {
            //conexao.fecharBanco(BANCO_DE_DADOS);
        }
    }

    // ABRIR BANCO
    public SQLiteDatabase abrirBanco(){
        try {
            BANCO_DE_DADOS = openOrCreateDatabase(NOME_BANCO, MODE_PRIVATE, null); // RETURN NULL
        } catch (Exception e) {
            Util.exibirMensagem("Erro ao criar o banco: " + e, AulaCadastroActivity.context);
            Log.i(TAG, "Erro ao abrir o banco: " + e);
        }
        return BANCO_DE_DADOS;
    }

错误是

07-05 13:12:54.800: E/AndroidRuntime(223): Uncaught handler: thread main exiting due to uncaught exception
07-05 13:12:54.811: E/AndroidRuntime(223): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.cadastro/br.cadastro.AulaCadastroActivity}: java.lang.NullPointerException
07-05 13:12:54.811: E/AndroidRuntime(223):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
07-05 13:12:54.811: E/AndroidRuntime(223):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
07-05 13:12:54.811: E/AndroidRuntime(223):  at android.app.ActivityThread.access$2200(ActivityThread.java:119)
07-05 13:12:54.811: E/AndroidRuntime(223):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
07-05 13:12:54.811: E/AndroidRuntime(223):  at android.os.Handler.dispatchMessage(Handler.java:99)
07-05 13:12:54.811: E/AndroidRuntime(223):  at android.os.Looper.loop(Looper.java:123)
07-05 13:12:54.811: E/AndroidRuntime(223):  at android.app.ActivityThread.main(ActivityThread.java:4363)
07-05 13:12:54.811: E/AndroidRuntime(223):  at java.lang.reflect.Method.invokeNative(Native Method)
07-05 13:12:54.811: E/AndroidRuntime(223):  at java.lang.reflect.Method.invoke(Method.java:521)
07-05 13:12:54.811: E/AndroidRuntime(223):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-05 13:12:54.811: E/AndroidRuntime(223):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-05 13:12:54.811: E/AndroidRuntime(223):  at dalvik.system.NativeStart.main(Native Method)
07-05 13:12:54.811: E/AndroidRuntime(223): Caused by: java.lang.NullPointerException
07-05 13:12:54.811: E/AndroidRuntime(223):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193)
07-05 13:12:54.811: E/AndroidRuntime(223):  at br.cadastro.Conexao.abrirBanco(Conexao.java:20)
07-05 13:12:54.811: E/AndroidRuntime(223):  at br.cadastro.ContadosDAO.criarBanco(ContadosDAO.java:27)
07-05 13:12:54.811: E/AndroidRuntime(223):  at br.cadastro.AulaCadastroActivity.inicializar(AulaCadastroActivity.java:81)
07-05 13:12:54.811: E/AndroidRuntime(223):  at br.cadastro.AulaCadastroActivity.onCreate(AulaCadastroActivity.java:27)
07-05 13:12:54.811: E/AndroidRuntime(223):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-05 13:12:54.811: E/AndroidRuntime(223):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
07-05 13:12:54.811: E/AndroidRuntime(223):  ... 11 more

完整的错误信息是什么?具体来说,堆栈跟踪是什么? - ikh
错误出现在我打开/创建我的数据库时 'openOrCreateDatabase(NOME_BANCO, MODE_PRIVATE, null); // 返回空值' - SHENN17
错误信息中的部分"Caused by: java.lang.NullPointerException ... at android.content.ContextWrapper.openOrCreateDatabase" 表明您可能在 openOrCreateDatabase 方法中传递了一个 null,而该方法不允许为空。请确认在将 NOME_BANCO 传递给 openOrCreateDatabase 之前,NOME_BANCO 不是空值。 - ikh
在将NOME_BANCO传递给openOrCreateDatabase之前,确保其不为空 =D - SHENN17
1个回答

1

很可能在这一行中未初始化NOME_BANCO

BANCO_DE_DADOS = openOrCreateDatabase(NOME_BANCO, MODE_PRIVATE, null);

这意味着实际上你正在传递:
BANCO_DE_DADOS = openOrCreateDatabase(null, MODE_PRIVATE, null);

因此出现了空指针异常。请检查它是否被设置为某个值,并且它是一个有效的路径。
编辑:
将文件名更改为正确的扩展名.db
private static String NOME_BANCO = "Cadastro";

变成:

private static String NOME_BANCO = "Cadastro.db";

您正在使用无效的路径/名称。 - IAmGroot
我不明白无效的路径/名称是什么意思? - SHENN17
您需要指定数据库名称。这是它在存储设备上创建的名称。数据库需要.db扩展名。 - IAmGroot
Doomsknight无法使用此私有static String NOME_BANCO = "Cadastro.db"; 我该如何放置格式化的代码? - SHENN17
最后能起作用的是 BANCO_DE_DADOS = openOrCreateDatabase(NOME_BANCO, MODE_PRIVATE, SQLiteDatabase.CREATE_IF_NECESSARY);,否则我不知道了,抱歉。 - IAmGroot
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接