Android getWritableDatabase有时仅抛出NullPointerException

时间:2014-09-13 10:10:47

标签: android nullpointerexception getwritabledatabase

我有一个片段,其中函数创建DatabaseHandler并调用对象中的函数:

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

使用DatabaseHandler构造函数:

Context context;

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

}

db.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 com.gcm.goalpocket.MainActivity$4@4634a608
    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)

1 个答案:

答案 0 :(得分:0)

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

在广播接收器运行时,无法保证活动有效Context