Android getWritableDatabase генерирует исключение NullPointerException только иногда
У меня есть фрагмент, где функция создает 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 ответ
В приемнике вещания, как указано onReceive()
в вашей трассировке стека, используйте переданный в Context
в качестве контекста вы переходите к вспомогательному конструктору.
Там нет никакой гарантии, что деятельность жива как действительная Context
во время работы вашего вещательного приемника.