的Android getWritableDatabase抛出的NullPointerException仅有时

问题描述:

我有其中一个函数创建一个数据库处理器和调用该对象内的功能的片段:的Android getWritableDatabase抛出的NullPointerException仅有时

final DatabaseHandler db = new DatabaseHandler(getActivity()); 
String teamName = db.getTeamName(); 

与数据库处理器构造之中:

Context context; 

public DatabaseHandler(Context contextPassed) { 
    super(contextPassed, DATABASE_NAME, null, DATABASE_VERSION); 
    context = contextPassed; 

} 

某处内分贝.getTeamName()(通过另一个函数)我有:

SQLiteDatabase db = this.getWritableDatabase();//exception here! 

这工作正常99%的时间。但是,如果应用程序在后台运行了一段时间,我又恢复了它,我得到一个NullPointerException。这很难复制,因为在这种情况发生之前,应用程序需要处于背景中很久。它让我想起垃圾收集?该过程由广播意图开始 - 不知道这是否相关。我无法真正调试它,因为我无法复制它 - 但每天早上当我醒来时,我都会测试它,它会崩溃。开始新的一天并不是一个好的方式,它让我疯狂! logcat的:

threadid=1: thread exiting with uncaught exception (group=0x400259f8) 
FATAL EXCEPTION: main 
java.lang.RuntimeException: Error receiving broadcast Intent { act=updateSettingsTeamName } in [email protected] 
    at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:938) 
    at android.os.Handler.handleCallback(Handler.java:587) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:144) 
    at android.app.ActivityThread.main(ActivityThread.java:4937) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 
    at com.gcm.goalpocket.DatabaseHandler.getUserID(DatabaseHandler.java:529) 
    at com.gcm.goalpocket.DatabaseHandler.getTeamName(DatabaseHandler.java:563) 
    at com.gcm.goalpocket.Settings.setTeamName(Settings.java:310) 
    at com.gcm.goalpocket.MainActivity$4.onReceive(MainActivity.java:257) 
+0

,如果你需要的数据库读取然后使用getReadableDatabse()只调用getWritableDatabase();当你需要写数据。 – 2014-09-13 10:15:46

+0

我现在就试试 - 可惜我没有办法测试,直到早上! – Cem 2014-09-13 10:24:35

在广播接收器在您的堆栈跟踪的onReceive()所示,使用传入的Context为您的上下文传递给助手的构造函数。

在您的广播接收机运行时,无法保证活动作为有效的Context存在。

+0

谢谢Laalto&Imtiyaz - 今天早上醒来没有错误! – Cem 2014-09-15 15:29:47